如何在数据库中表示继承?我正在考虑如何在SQL Server数据库中表示复杂的结构。考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见。例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险。在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的。但是,关系数据库似乎不容易这样做。我可以看到有两个主要选择:为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null。创建一个Policy表和许多Section表,每个表对应一种封面。这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查。这种情况的最佳做法是什么?
4 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
第三个选项是创建一个“Policy”表,然后是一个“SectionsMain”表,它存储所有部分类型中共同的所有字段。然后为每种类型的部分创建其他表,这些表只包含不常见的字段。
确定哪个最佳取决于您拥有的字段数以及编写SQL的方式。他们都会工作。如果你只有几个领域,那么我可能会选择#1。对于“很多”的领域,我会倾向于#2或#3。
神不在的星期二
TA贡献1963条经验 获得超6个赞
根据提供的信息,我将对数据库建模以具有以下内容:
政策
POLICY_ID(主键)
负债
LIABILITY_ID(主键)
POLICY_ID(外键)
性能
PROPERTY_ID(主键)
POLICY_ID(外键)
......依此类推,因为我希望政策的每个部分都有不同的属性。否则,可能会有一个SECTIONS
表,除此之外policy_id
,还有section_type_code
...
无论哪种方式,这将允许您支持每个策略的可选部分......
我不明白你对这种方法的不满意 - 这是你在保持参照完整性而不是复制数据的同时存储数据的方式。这个词是“标准化的”......
因为SQL是基于SET的,所以它对于程序/ OO编程概念来说相当陌生,并且需要代码从一个领域转换到另一个领域。通常会考虑ORM,但它们在大批量复杂系统中不能很好地工作。
蛊毒传说
TA贡献1895条经验 获得超3个赞
另一种方法是使用INHERITS
组件。例如:
CREATE TABLE person ( id int , name varchar(20), CONSTRAINT pessoa_pkey PRIMARY KEY (id));CREATE TABLE natural_person ( social_security_number varchar(11), CONSTRAINT pessoaf_pkey PRIMARY KEY (id)) INHERITS (person);CREATE TABLE juridical_person ( tin_number varchar(14), CONSTRAINT pessoaj_pkey PRIMARY KEY (id)) INHERITS (person);
因此,可以在表之间定义继承。
添加回答
举报
0/150
提交
取消