关系数据库和PHP:具有多个一个表的一对多关系

时间:2015-08-12 16:55:40

标签: mysql database

我们假设表cars中有一些行,并且每个行都有一个所有者。如果这个所有者总是一个人(方便地位于表persons中),这将是您标准的一对多关系。

但是,如果所有者不仅可以是一个人,还可以是公司(在表companies中),该怎么办?如何建立这种关系以及如何在PHP中处理它?

我的第一个想法是创建一个列person和一列company并检查其中一个列始终保持NULL,而另一个则填充 - 但是,这似乎有点不优雅一旦有更多可能的相关表格,就变得不切实际。

我目前的假设是不是简单地将外键创建为表中的整数列person,而是创建另一个名为tables的表,该表为表提供ID,然后将外键拆分为两个整数列:owner_table,包含表的ID(例如0表示persons,1表示companies),owner_id包含所有者ID。

这是一个可行且实用的解决方案,还是有一些关于此类问题的标准设计模式?这类问题有名字吗?有没有支持这种关系的PHP框架?

编辑:找到解决方案:这种结构称为多态关系,Laravel supports them

1 个答案:

答案 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
};