gia*_*kis 3 mysql schema database-design constraint
我有以下设计。每个用户都有它自己的联系人,它自己的主机并将它们分配给一个只属于他的域。
我想确保您分配给域的主机属于该域分配给的用户。
这是我必须在我的应用程序逻辑中确保的东西吗?
如果我设置domains.user_id foreign key为参考host.user_id,user_id.id它会消除我的问题吗?

顺便说一句,谁能建议我为我的架构设计更好的设计?
当设计具有“菱形”形状时,这是一个相当普遍的问题。查看类似问题:
多对多和弱实体
使用 MySQL,我会使用这样的东西:
(0)请注意,我更喜欢user_idas 主键的名称,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)
) ;
Run Code Online (Sandbox Code Playgroud)
桌子 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)
) ;
Run Code Online (Sandbox Code Playgroud)
桌子 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)
) ;
Run Code Online (Sandbox Code Playgroud)
桌子 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)
) ;
Run Code Online (Sandbox Code Playgroud)