一尘不染

多个但互斥的外键-这是要走的路吗?

mysql

我有三个表:用户,公司和网站。用户和公司都有网站,因此每个用户记录在“网站”表中都有一个外键。同样,每个公司记录在“网站”表中都有一个外键。

现在,我想将外键包含在“网站”表中,再放回它们各自的“父”记录中。我怎么做?每个网站记录中是否应该有两个外键,其中一个始终为NULL?还是还有另一条路要走?


阅读 338

收藏
2020-05-17

共1个答案

一尘不染

如果我们在这里查看模型,将会看到以下内容:

  1. 用户与一个网站相关
    • 公司与一个网站相关
    • 网站仅与一个用户或公司相关

第三个关系意味着存在一个“用户或公司”实体,该实体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
)
2020-05-17