Mysql

建模兩個依賴的多對多關係

  • January 23, 2019

我有一個使用者可能有 0 個或多個 foo 和 bar。這是一個圖表:

在此處輸入圖像描述

每個 foo 都有一個唯一的整數ord

如果使用者有一個 bar,那麼這意味著他有一個 foo ord=1。如果沒有 bar,使用者可能沒有 foo ord=1

我認為如何避免邏輯不一致是簡單的永遠不要插入任何foo_user關係ord=1。但是,當我想查詢最小使用者的 foo 時,ord我需要這樣做有點複雜,如下所示:

    1. 查詢:檢查條形關係是否存在。如果是這樣,得到 foo 與ord=1
    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 模型的責任

引用自:https://dba.stackexchange.com/questions/227853