gpt4 book ai didi

mysql - 关系数据库和 PHP : one-to-many relations with multiple one-tables

转载 作者:行者123 更新时间:2023-11-29 12:03:27 26 4
gpt4 key购买 nike

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

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

我的第一个想法是创建一个列 person 和一个列 company 并检查其中一个始终保持 NULL,而另一个始终保持 NULL已填满 - 然而,这似乎有些不雅观,并且一旦存在大量可能的相关表就变得不切实际。

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

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

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

最佳答案

有多种方法可以做到这一点。

您可以使用两个可为空的外键:一个引用公司,另一个引用用户。然后你就可以拥有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
};

关于mysql - 关系数据库和 PHP : one-to-many relations with multiple one-tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31971215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com