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

Sle*_*ter 5 mysql sql database-design data-modeling

我有三个表:用户,公司和网站.用户和公司拥有网站,因此每个用户记录都有一个外键进入网站表.此外,每个公司记录都有一个外键进入网站表.

现在我想将网站表中的外键包含回各自的"父"记录中.我怎么做?我应该在每个网站记录中有两个外键,其中一个永远是NULL吗?或者还有另一种方法吗?

Qua*_*noi 10

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

  1. 用户与一个网站完全相关
    • 公司只与一个网站相关
    • 网站只与一个用户或公司相关

第三种关系意味着存在PRIMARY KEY应该存储在某处的"用户或公司"实体.

要保存它,你需要创建一个能够存储表PRIMARY KEY一的website owner实体.该表还可以存储用户和网站共有的属性.

由于它是一对一的关系,因此网站属性也可以存储在此表中.

用户和公司未共享的属性应存储在单独的表中.

要强制使用正确的关系,您需要PRIMARY KEYwebsite复合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)


kni*_*ttl 6

如果您不需要父列,则可以通过在users和companies表上进行简单的select(或连接表)来查找父级.如果您想知道这是用户还是公司网站,我建议您在网站表格中使用布尔列.