约束关系

gia*_*kis 3 mysql schema database-design constraint

我有以下设计。每个用户都有它自己的联系人,它自己的主机并将它们分配给一个只属于他的

我想确保您分配给主机属于该分配给的用户

这是我必须在我的应用程序逻辑中确保的东西吗?

如果我设置domains.user_id foreign key为参考host.user_iduser_id.id它会消除我的问题吗?

在此处输入图片说明

顺便说一句,谁能建议我为我的架构设计更好的设计?

ype*_*eᵀᴹ 6

当设计具有“菱形”形状时,这是一个相当普遍的问题。查看类似问题:
多对多和弱实体

使用 MySQL,我会使用这样的东西:

(0)请注意,我更喜欢user_idas 主键的名称,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)
) ;
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)