我有三个表:用户,公司和网站。用户和公司都有网站,因此每个用户记录在“网站”表中都有一个外键。同样,每个公司记录在“网站”表中都有一个外键。
现在,我想将外键包含在“网站”表中,再放回它们各自的“父”记录中。我怎么做?每个网站记录中是否应该有两个外键,其中一个始终为NULL?还是还有另一条路要走?
如果我们在这里查看模型,将会看到以下内容:
第三个关系意味着存在一个“用户或公司”实体,该实体PRIMARY KEY应存储在某处。
PRIMARY KEY
要保存它,你需要创建一个能够存储表PRIMARY KEY一的website owner实体。该表还可以存储用户和网站共有的属性。
website owner
由于这是一对一的关系,因此网站属性也可以存储在此表中。
用户和公司未共享的属性应存储在单独的表中。
要强制正确的关系,你需要做PRIMARY KEY的的website复合材料owner type作为它的一部分,并强制正确的类型与子表CHECK的约束:
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 )