【发布时间】: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 标记,并希望无论如何都会提出一些框架建议。
-
我建议您更好地了解关系模型的工作原理。所有者始终是所有者,可以是个人或公司。但也要考虑到,就像在现实世界中一样,任何资产(如汽车)都可以拥有两个或多个所有者。