为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2019-05-29 15:57:14
如何在数据库中表示继承?我正在考虑如何在SQL Server数据库中表示复杂的结构。考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见。例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险。在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的。但是,关系数据库似乎不容易这样做。我可以看到有两个主要选择:为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null。创建一个Policy表和许多Section表,每个表对应一种封面。这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查。这种情况的最佳做法是什么?
查看完整描述

4 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

第三个选项是创建一个“Policy”表,然后是一个“SectionsMain”表,它存储所有部分类型中共同的所有字段。然后为每种类型的部分创建其他表,这些表只包含不常见的字段。

确定哪个最佳取决于您拥有的字段数以及编写SQL的方式。他们都会工作。如果你只有几个领域,那么我可能会选择#1。对于“很多”的领域,我会倾向于#2或#3。


查看完整回答
反对 回复 2019-05-29
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

根据提供的信息,我将对数据库建模以具有以下内容:

政策

  • POLICY_ID(主键)

负债

  • LIABILITY_ID(主键)

  • POLICY_ID(外键)

性能

  • PROPERTY_ID(主键)

  • POLICY_ID(外键)

......依此类推,因为我希望政策的每个部分都有不同的属性。否则,可能会有一个SECTIONS表,除此之外policy_id,还有section_type_code...

无论哪种方式,这将允许您支持每个策略的可选部分......

我不明白你对这种方法的不满意 - 这是你在保持参照完整性而不是复制数据的同时存储数据的方式。这个词是“标准化的”......

因为SQL是基于SET的,所以它对于程序/ OO编程概念来说相当陌生,并且需要代码从一个领域转换到另一个领域。通常会考虑ORM,但它们在大批量复杂系统中不能很好地工作。


查看完整回答
反对 回复 2019-05-29
?
蛊毒传说

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);

因此,可以在表之间定义继承。


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 1063 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信