【问题标题】:Relational database and PHP: one-to-many relations with multiple one-tables关系数据库和PHP:与多个一表的一对多关系
【发布时间】:2015-11-05 10:00:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 本题与php无关,纯sql题。我建议你删除标签php。
  • @arkascha,我不想——我的主要目标是找到一个支持这种数据结构的 PHP 框架。到目前为止,我已经搜索了多个框架,要么这个功能没有实现,要么隐藏在我不知道的某个关键字下。
  • 不,在框架中实现这样一个特定的模型是没有意义的。框架更通用。这就是为什么我说这与php无关。获得某种形式的“黑匣子”最接近的方法是在数据库服务器内使用views 来模拟表到对象或列表的映射。但这又与 php 无关。
  • 对不起,我不知道这是一个如此具体的问题——我宁愿把它当作 ORM 的核心问题,因为这个用例在 OO 数据管理中一遍又一遍地弹出。看到在 PHP 中创建这样的数据模型很容易,我猜想会有一种标准的方法将它们保存在数据库中。我已经删除了 PHP 标记,并希望无论如何都会提出一些框架建议。
  • 我建议您更好地了解关系模型的工作原理。所有者始终是所有者,可以是个人或公司。但也要考虑到,就像在现实世界中一样,任何资产(如汽车)都可以拥有两个或多个所有者。

标签: mysql database


【解决方案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
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2019-11-07
    • 2019-07-21
    • 2021-09-05
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多