这个问题在这里已经有答案了:
如何在数据库中表示继承(8个答案)
9个月前关门了。
我有一个关系数据库,我想在其中有一个表'实体'。这个实体有一种类型:要么是个人,要么是公司,要么是非营利组织。根据此类型,它应具有不同的属性(列):
Person:
- id
- name
- age
- statuses: ['child', 'adult', 'senior']
Company:
- id
- name
- address
- contact_form
- industry
- statuses: ['startup', 'scaleup', 'corporate']
NonProfit:
- id
- name
- address
- bank_account
- statuses: ['environmental', 'social']
它们都有一个名字,在前端,它们应该以类似的方式出现在一个列表中:
Entities:
Name Type Status
----------------------------------
Mary Person Adult
Mcenroe Company Startup
Joe Person Child
BetterWorld NonProfit Social
如果随后单击“详细信息”(取决于类型),则实体将以不同的方式显示。
我将创建4个不同的表:entity、person、company和unprivate,然后引用entity表中后三个表中的任意一个。
Entity:
- id
- person_id #optional
- company_id #optional
- nonprofit_id #optional
然后以某种方式强制实体只有三个外键中的一个。但是感觉很笨重,所以我觉得有更好的办法。不过,我对关系数据库不太熟悉。
在关系数据库中启用这种数据的最佳方法是什么?
2条答案
按热度按时间ni65a41a1#
您最好使用一个表并检查约束:
sql不擅长这些“其中之一”关系。这为您带来的是与实体具有外键关系的能力,而不考虑类型。
如果将数据拆分为三个单独的表,则将失去拥有此类外键关系的能力。
另一种是最好的两个世界是四张table,一张table
entities
表和三个附加表,每种类型一个。附加表和entity
表可以共享相同的主键。不过,在本例中,有些键重叠列是特定于类型的,因此即使这样也会有点混乱。例如,如果将状态存储在类型表中,实体查询将如下所示:这看起来有点混乱,和所有这些相比
check
约束条件。64jmpszr2#
如果ask需要一个公共实体来显示这三个实体的数据,那么一个视图如何组合这三个实体的数据->个人/非营利组织/公司,如下所示。我假设一个人和一家公司之间没有任何关系,除了数据模型中只有两个实体这一事实。