Mysql

約束關係

  • July 11, 2016

我有以下設計。每個使用者都有自己的聯繫人,自己的主機,並將它們分配給只屬於他的域。

我想確保分配給域的**主機屬於分配域的使用者

這是我必須在我的應用程序邏輯中確保的東西嗎?

如果我設置domains.user_id foreign key為參考host.user_iduser_id.id它是否消除了我的問題?

在此處輸入圖像描述

順便說一句,任何人都可以建議我為我的架構設計一個更好的設計嗎?

當設計具有“菱形”形狀時,這是一個相當普遍的問題。查看類似問題:

多對多和弱實體

使用 MySQL,我會使用這樣的東西:

(0)請注意,我更喜歡user_id作為主鍵的名稱,users而不是id所有表的名稱。否則我發現 SQL 程式碼完全令人困惑(另外你可以使用JOIN ... USING (tablename_id)語法)。

(1)表中的額外UNIQUE約束,是表hostscontacts的外鍵所需要的domains

(2)表中的兩個FOREIGN KEY約束domains被更改為使用複合鍵(包括user_id)。

桌子**users**

CREATE TABLE users
( user_id INT NOT NULL AUTO_INCREMENT
, username VARCHAR(45) NOT NULL
-- other columns
, PRIMARY KEY (user_id)
) ;

桌子**contacts**

CREATE TABLE contacts
( contact_id INT NOT NULL AUTO_INCREMENT
, user_id INT NOT NULL
, info TEXT
, PRIMARY KEY (contact_id)
, UNIQUE INDEX (user_id, contact_id)       -- added, see comment 1 above
, INDEX (user_id)
, FOREIGN KEY (user_id)
   REFERENCES users (user_id)
) ;

桌子**hosts**

CREATE TABLE hosts
( host_id INT NOT NULL AUTO_INCREMENT
, user_id INT NOT NULL
, name VARCHAR(45) NOT NULL
--
, PRIMARY KEY (host_id)
, UNIQUE INDEX (user_id, host_id)          -- added, see comment 1 above
, INDEX (user_id)
, FOREIGN KEY (user_id)
   REFERENCES users (user_id)
) ;

桌子**domains**

CREATE TABLE domains
( domain_id INT NOT NULL AUTO_INCREMENT
, user_id INT NOT NULL
, contact_id INT NOT NULL
, host_id INT NULL                       -- nullable based on comments
, name VARCHAR(45) NOT NULL
-- other columns
, PRIMARY KEY (domain_id)
, FOREIGN KEY (user_id, contact_id)       -- composite FK, see comment 2
   REFERENCES contacts (user_id, contact_id)
, FOREIGN KEY (user_id, host_id)          -- composite FK, see comment 2
   REFERENCES hosts (user_id, host_id)
) ;

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