我们假设表cars
中有一些行,并且每个行都有一个所有者。如果这个所有者总是一个人(方便地位于表persons
中),这将是您标准的一对多关系。
但是,如果所有者不仅可以是一个人,还可以是公司(在表companies
中),该怎么办?如何建立这种关系以及如何在PHP中处理它?
我的第一个想法是创建一个列person
和一列company
并检查其中一个列始终保持NULL
,而另一个则填充 - 但是,这似乎有点不优雅一旦有更多可能的相关表格,就变得不切实际。
我目前的假设是不是简单地将外键创建为表中的整数列person
,而是创建另一个名为tables
的表,该表为表提供ID,然后将外键拆分为两个整数列:owner_table
,包含表的ID(例如0表示persons
,1表示companies
),owner_id
包含所有者ID。
这是一个可行且实用的解决方案,还是有一些关于此类问题的标准设计模式?这类问题有名字吗?有没有支持这种关系的PHP框架?
编辑:找到解决方案:这种结构称为多态关系,Laravel supports them。
答案 0 :(得分:1)
有多种方法可以做到。
您可以使用两个可以为空的外键:一个引用公司和另一个用户。然后你可以有一个check constraint来确保你是一个空的。使用PostgreSQL:
CREATE TABLE car{
<your car fields>
company_id INT REFERENCES car,
person_id INT REFERENCES person,
CHECK(company_id IS NULL AND person_id IS NOT NULL
OR company_id IS NOT NULL AND person_id IS NULL)
};
或者您可以使用table inheritance(注意其限制)
CREATE TABLE car_owner{
car_owner_id SERIAL
};
CREATE TABLE company{
<company fields>
} INHERITS(car_owner);
CREATE TABLE person{
<person fields>
} INHERITS(car_owner);
CREATE TABLE car{
<car fields>
car_owner_id INT REFERENCES car_owner
};