如何在数据库中表示继承?

如何在数据库中表示继承?

我正在考虑如何在SQL Server数据库中表示复杂的结构。

考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见。例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险。

在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的。但是,关系数据库似乎不容易这样做。

我可以看到有两个主要选择:

  1. 为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null。

  2. 创建一个Policy表和许多Section表,每个表对应一种封面。

这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查。

这种情况的最佳做法是什么?


温温酱
浏览 1066回答 4
4回答

小怪兽爱吃肉

第三个选项是创建一个“Policy”表,然后是一个“SectionsMain”表,它存储所有部分类型中共同的所有字段。然后为每种类型的部分创建其他表,这些表只包含不常见的字段。确定哪个最佳取决于您拥有的字段数以及编写SQL的方式。他们都会工作。如果你只有几个领域,那么我可能会选择#1。对于“很多”的领域,我会倾向于#2或#3。

神不在的星期二

根据提供的信息,我将对数据库建模以具有以下内容:政策POLICY_ID(主键)负债LIABILITY_ID(主键)POLICY_ID(外键)性能PROPERTY_ID(主键)POLICY_ID(外键)......依此类推,因为我希望政策的每个部分都有不同的属性。否则,可能会有一个SECTIONS表,除此之外policy_id,还有section_type_code...无论哪种方式,这将允许您支持每个策略的可选部分......我不明白你对这种方法的不满意 - 这是你在保持参照完整性而不是复制数据的同时存储数据的方式。这个词是“标准化的”......因为SQL是基于SET的,所以它对于程序/ OO编程概念来说相当陌生,并且需要代码从一个领域转换到另一个领域。通常会考虑ORM,但它们在大批量复杂系统中不能很好地工作。

蛊毒传说

另一种方法是使用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);因此,可以在表之间定义继承。
打开App,查看更多内容
随时随地看视频慕课网APP