我正在考虑如何在SQL Server数据库中表示复杂的结构.
考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见.例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险.
在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的.但是,关系数据库似乎不容易这样做.
我可以看到有两个主要选择:
为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null.
创建一个Policy表和许多Section表,每个表对应一种封面.
这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查.
这种情况的最佳做法是什么?
sql database inheritance database-design class-table-inheritance
在数据库中建模继承的最佳实践是什么?
权衡取舍(例如可疑性)是什么?
(我对SQL Server和.NET最感兴趣,但我也想了解其他平台如何解决这个问题.)
如果我有一个叫动物的类,狗和鱼是子类.动物具有称为"颜色"的属性.狗具有称为"尾长"的属性,并且鱼没有此属性.鱼具有称为"重量"的属性,狗没有这个属性.
所以,我想设计一个数据库来存储这些信息.我该怎么办?这是一些想法:
想法1:制作动物表,并且表格有类型,以找到什么样的动物,如果是狗,只需从狗桌得到结果.
Animal:color:String类型:int
类型:狗:0鱼:1
狗:TailLength:int
鱼:重量:int
想法2:只在数据库中存储Dog表和Fish表,删除动物表.
狗:颜色:字符串TailLength:int
鱼:颜色:字符串重量:int
我有一个Access数据库.让我们假装它是一家宠物商店.
有一张动物桌子.
Animals (animal_id, birth_date, price)
Run Code Online (Sandbox Code Playgroud)
然后是我们销售的不同类型动物的特定表格.
Dogs (animal_id, bark_volume)
Cats (animal_id, collar_size, shedding_rate)
Fish (animal_id)
Run Code Online (Sandbox Code Playgroud)
鱼没有趣味,所以它们没有任何特殊的领域.Fish表存在,因此您知道Animals表中的哪些记录是鱼.
现在,我有一个通用的表格,可以将动物添加到宠物商店.在你获得表格之前,首先要说明你要添加什么样的动物.基于此,表单显示/隐藏字段,更改其记录源,并将字段绑定到适当的数据列.表单从查询DogInfo,CatInfo和FishInfo中提取数据.
现在,当你进入一只狗或一只猫时,一切都很好.记录被添加到动物和狗或猫.
然而,当你进入鱼类时,你得到的只是动物,没有鱼.
可能是什么导致了这个?是不是因为鱼桌上缺少其他栏而引起的?
(让我们撇开这样一个事实,即使用select查询更新表格根本就没有意义.我没想到Access首先让我这么做,但Access的座右铭似乎是"让错误的事情变得容易"做得和正确的事情很难做到."数据库相对简单且不经常使用,并且它比我开始工作之前至少好100倍,所以我真的不太担心这个问题只要我能使它工作.)