Sql 数据库模型中的分类
我有一个关系数据库,我想在其中有一个表“实体”。这个实体有一种类型:要么是个人,要么是公司,要么是非营利组织。根据此类型,它应具有不同的属性(列): 它们都有一个名称,在前端,它们应该以类似的方式出现在列表中:Sql 数据库模型中的分类,sql,database-design,relationship,Sql,Database Design,Relationship,我有一个关系数据库,我想在其中有一个表“实体”。这个实体有一种类型:要么是个人,要么是公司,要么是非营利组织。根据此类型,它应具有不同的属性(列): 它们都有一个名称,在前端,它们应该以类似的方式出现在列表中: Entities: Name Type Status ---------------------------------- Mary Person Adult Mcenroe Company Startu
Entities:
Name Type Status
----------------------------------
Mary Person Adult
Mcenroe Company Startup
Joe Person Child
BetterWorld NonProfit Social
如果随后单击“详细信息”(取决于类型),实体将以不同的方式显示
我将创建4个不同的表:实体、个人、公司和非营利组织,然后在实体表中引用后三个表中的任意一个
Entity:
- id
- person_id #optional
- company_id #optional
- nonprofit_id #optional
然后以某种方式强制实体只有三个外键中的一个。但它感觉很笨重,所以我认为有更好的方法。不过,我对关系数据库不太熟悉
在关系数据库中启用此类数据的最佳方法是什么?您最好使用单个表并检查约束:
create table entities (
entityid . . .,
name varchar(255),
type varchar(255),
status varchar(255),
age int,
. . . -- remaining columns
check (type in ('Person', 'Company', 'Nonprofit'))
check (type = 'Person' and status in ('child', 'adult', 'senior') or
type = 'Company' and status in ('startup', 'scaleup', 'corporate') or
type = 'Nonprofit' and status in ('environmental', 'social')
),
check (age is null or type = 'Person'),
. . . -- remaining check constraints
);
SQL在这些“其中之一”关系方面并不擅长。这为您带来的是与实体具有外键关系的能力,而不管其类型如何
如果将数据拆分为三个单独的表,则将失去拥有此类外键关系的能力
两种情况中最好的一种选择是四个表,一个实体
表和三个附加表,每种类型一个。附加表和实体
表可以共享相同的主键。不过,在本例中,您有一些特定于类型的键重叠列,因此即使这样也会有点混乱。例如,如果将状态存储在类型表中,实体查询将如下所示:
select e.*, coalesce(p.status, c.status, e.status)
from entities e left join
persons p
on e.entity_id = p.person_id left join
companies c
on e.entity_id = c.company_id left join
nonprofits n
on e.entity_id = e.nonprofit_id;
这似乎有点混乱,与所有那些
检查约束相比。如果问题是要有一个公共实体来显示来自三个实体的数据,那么下面的视图如何组合来自三个实体的数据->个人/非营利组织/公司,如下所示。我假设一个人和一家公司之间没有任何关系,除了在您的数据模型中它们只是两个实体这一事实
create view all_entites
as
select name,'Person' as entity,status
from Person
union all
select name,'Company' as entity,status
from Company
union all
select name,'NonProfit' as entity,status
from NonProfit
这个问题可能有答案。这两个问题对理解我的问题都非常有价值。需要知道术语、继承和链接中描述的独占一对一关系,这些术语已经出现在脑海中,但不确定如何查找。谢谢@philipxy和WalterMitty
create view all_entites
as
select name,'Person' as entity,status
from Person
union all
select name,'Company' as entity,status
from Company
union all
select name,'NonProfit' as entity,status
from NonProfit