Mysql
約束關係
我有以下設計。每個使用者都有自己的聯繫人,自己的主機,並將它們分配給只屬於他的域。
我想確保您分配給域的**主機屬於分配域的使用者。
這是我必須在我的應用程序邏輯中確保的東西嗎?
如果我設置
domains.user_id
foreign key
為參考host.user_id
,user_id.id
它是否消除了我的問題?順便說一句,任何人都可以建議我為我的架構設計一個更好的設計嗎?
當設計具有“菱形”形狀時,這是一個相當普遍的問題。查看類似問題:
使用 MySQL,我會使用這樣的東西:
(0)請注意,我更喜歡
user_id
作為主鍵的名稱,users
而不是id
所有表的名稱。否則我發現 SQL 程式碼完全令人困惑(另外你可以使用JOIN ... USING (tablename_id)
語法)。(1)表中的額外
UNIQUE
約束,是表hosts
中contacts
的外鍵所需要的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) ) ;