数据库设计 - 两个外键,但一个始终为空,另一个始终不为空
Database design - two foreign keys but one is always null and the other is always not null
我有三个 table: property
、person
和 company
。一个属性只能属于一个人或一个公司。一个人或一家公司可以拥有多个属性。
我当前的数据库设计是在 property
table 中包含两个外键 - person_id
和 company_id
,始终其中一个为空,另一个不为空。我只是想知道在这种情况下是否有更好的方法来设计数据库?
CREATE TABLE person(
person_id int NOT NULL PRIMARY KEY,
name varchar(255)
);
CREATE TABLE company(
company_id int NOT NULL PRIMARY KEY,
name varchar(255)
);
CREATE TABLE property(
property_id int NOT NULL PRIMARY KEY,
name varchar(255),
person_id REFERENCES person,
company_id REFERENCES company
);
创建额外的 table CHECK 约束:
CREATE TABLE property(
property_id int NOT NULL PRIMARY KEY,
name varchar(255),
person_id REFERENCES person,
company_id REFERENCES company,
CHECK (person_id IS NULL + company_id IS NULL = 1)
);
这将禁止错误的值(均为 NULL 或均为 NOT NULL)。
PS。两个引用的存在本身是合法和安全的。
我有三个 table: property
、person
和 company
。一个属性只能属于一个人或一个公司。一个人或一家公司可以拥有多个属性。
我当前的数据库设计是在 property
table 中包含两个外键 - person_id
和 company_id
,始终其中一个为空,另一个不为空。我只是想知道在这种情况下是否有更好的方法来设计数据库?
CREATE TABLE person(
person_id int NOT NULL PRIMARY KEY,
name varchar(255)
);
CREATE TABLE company(
company_id int NOT NULL PRIMARY KEY,
name varchar(255)
);
CREATE TABLE property(
property_id int NOT NULL PRIMARY KEY,
name varchar(255),
person_id REFERENCES person,
company_id REFERENCES company
);
创建额外的 table CHECK 约束:
CREATE TABLE property(
property_id int NOT NULL PRIMARY KEY,
name varchar(255),
person_id REFERENCES person,
company_id REFERENCES company,
CHECK (person_id IS NULL + company_id IS NULL = 1)
);
这将禁止错误的值(均为 NULL 或均为 NOT NULL)。
PS。两个引用的存在本身是合法和安全的。