Mysql
建模兩個依賴的多對多關係
我有一個使用者可能有 0 個或多個 foo 和 bar。這是一個圖表:
每個 foo 都有一個唯一的整數
ord
。如果使用者有一個 bar,那麼這意味著他有一個 foo
ord=1
。如果沒有 bar,使用者可能沒有 fooord=1
。我認為如何避免邏輯不一致是簡單的永遠不要插入任何
foo_user
關係ord=1
。但是,當我想查詢最小使用者的 foo 時,ord
我需要這樣做有點複雜,如下所示:
- 查詢:檢查條形關係是否存在。如果是這樣,得到 foo 與
ord=1
- 查詢:如果不存在 bar bar 關係,則獲取最小
ord
列的 foo。對於這種情況,是否有更方便的數據庫結構?
示意圖:
CREATE TABLE users (id, name, PK (id)); CREATE TABLE user_foo (user_id, foo_id, PK (user_id, foo_id), FK (user_id) REF users (id), FK (foo_id) REF foo (id)); CREATE TABLE foo (id, name, ord, PK (id), KEY (id, ord)); CREATE TABLE foo_bar (foo_id, ord AS (1) VIRTUAL, bar_id, PK (bar_id, foo_id), FK (foo_id, ord) REF foo (id, ord), FK (bar_id) REF bar (id)); CREATE TABLE bar (id, name, PK (id));
一個 foo 也可能有很多使用者,因此數據透視表是必要的。
考慮到了。
foo 和 bar 是多對多關係
考慮到了。
假設您沒有遺漏 foo 和 bar 之間的任何關係,那麼我認為您可能會將實體關係模型與業務邏輯的限制混合在一起。
一個使用者有許多 foo,許多 bar,反之亦然。到現在為止還挺好。檢查 foo 是否
ord=1
存在是您的數據庫引擎的責任,而不是您的 er 模型的責任