Sle*_*ter 5 mysql sql database-design data-modeling
我有三个表:用户,公司和网站.用户和公司拥有网站,因此每个用户记录都有一个外键进入网站表.此外,每个公司记录都有一个外键进入网站表.
现在我想将网站表中的外键包含回各自的"父"记录中.我怎么做?我应该在每个网站记录中有两个外键,其中一个永远是NULL吗?或者还有另一种方法吗?
Qua*_*noi 10
如果我们在这里查看模型,我们将看到以下内容:
第三种关系意味着存在PRIMARY KEY应该存储在某处的"用户或公司"实体.
要保存它,你需要创建一个能够存储表PRIMARY KEY一的website owner实体.该表还可以存储用户和网站共有的属性.
由于它是一对一的关系,因此网站属性也可以存储在此表中.
用户和公司未共享的属性应存储在单独的表中.
要强制使用正确的关系,您需要PRIMARY KEY将website复合owner type作为其中的一部分,并使用CHECK约束强制子表中的正确类型:
CREATE TABLE website_owner (
type INT NOT NULL,
id INT NOT NULL,
website_attributes,
common_attributes,
CHECK (type IN (1, 2)) -- 1 for user, 2 for company
PRIMARY KEY (type, id)
)
CREATE TABLE user (
type INT NOT NULL,
id INT NOT NULL PRIMARY KEY,
user_attributes,
CHECK (type = 1),
FOREIGN KEY (type, id) REFERENCES website_owner
)
CREATE TABLE company (
type INT NOT NULL,
id INT NOT NULL PRIMARY KEY,
company_attributes,
CHECK (type = 2),
FOREIGN KEY (type, id) REFERENCES website_owner
)
Run Code Online (Sandbox Code Playgroud)
如果您不需要父列,则可以通过在users和companies表上进行简单的select(或连接表)来查找父级.如果您想知道这是用户还是公司网站,我建议您在网站表格中使用布尔列.