我正在考虑如何在SQL Server数据库中表示复杂的结构.
考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见.例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险.
在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的.但是,关系数据库似乎不容易这样做.
我可以看到有两个主要选择:
为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null.
创建一个Policy表和许多Section表,每个表对应一种封面.
这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查.
这种情况的最佳做法是什么?
sql database inheritance database-design class-table-inheritance
com.something.SuperClass:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
private static final long serialVersionUID = -695503064509648117L;
long confirmationCode;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
public long getConfirmationCode() {
return confirmationCode;
}
public void setConfirmationCode(long confirmationCode) {
this.confirmationCode = confirmationCode;
}
}
Run Code Online (Sandbox Code Playgroud)
com.something.SubClass:
@Entity
public abstract class Subclass extends SuperClass {
private static final long serialVersionUID = 8623159397061057722L;
String name;
@Column(nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = …Run Code Online (Sandbox Code Playgroud) 我们通过将一个Table的PK作为FK添加到另一个表来实现一对多关系.我们通过将第2个表的PK添加到第三个表来实现多对多关系.
我们如何实施IS-A关系?
实体是技术人员和行政人员,均为员工.我可以在表EMPLOYEE中使用额外的字段(id,name,surname,role,... AdminFields ...,... TechFields ......)
但我想探索IS-A选项.
编辑:我按照Donnie的建议,但没有角色领域.
什么是提示/技巧,当你需要与继承,不支持继承关系数据库持久化类?
说我有这个经典的例子:
Person -> Employee -> Manager
-> Team lead
-> Developer
-> Customer -> PrivilegedCustomer
-> EnterpriseCustomer
Run Code Online (Sandbox Code Playgroud)
有哪些设计数据库的技术?各有利弊?
PS我已经搜查,发现有关数据库继承的几个问题,但大多数是有关更改到支持它本身数据库引擎.但是,让我说我坚持使用SQL Server 2005 ......我的选择是什么?
我的问题是关系数据库系统中的继承建模.我有规范的数据模型,并且我有一些与产品定价相关的字段,从产品表继承某些属性,我想在MySQL关系数据库中建模这种继承,所以,
"我们如何在关系数据库中进行继承建模?"
谢谢.
mysql database inheritance data-modeling class-table-inheritance
假设您正在设置数据库来存储各种车辆的碰撞测试数据.您想存储快艇,汽车和卡丁车的碰撞测试数据.
您可以创建三个单独的表:SpeedboatTests,CarTests和GokartTests.但是每个表中的很多列都是相同的(例如,执行测试的人员的员工ID,碰撞的方向(正面,侧面,后面)等).但是,很多列都会有所不同,因此您不希望将所有测试数据放在一个表中,因为您将拥有相当多的列,对于快艇来说总是为空,相当多的列始终是对于汽车来说是零,而对于卡丁车来说,相当多的都是空的.
假设您还想存储一些与测试没有直接关系的信息(例如正在测试的东西的设计者的员工ID).这些列根本不适合放入"测试"表,特别是因为它们将在同一车辆上的所有测试中重复使用.
让我说明一种可能的表格排列,以便您可以看到所涉及的问题.
Speedboats id | col_about_speedboats_but_not_tests1 | col_about_speedboats_but_not_tests2 Cars id | col_about_cars_but_not_tests1 | col_about_cars_but_not_tests2 Gokarts id | col_about_gokarts_but_not_tests1 | col_about_gokarts_but_not_tests2 Tests id | type | id_in_type | col_about_all_tests1 | col_about_all_tests2 (id_in_type will refer to the id column of one of the next three tables, depending on the value of type) SpeedboatTests id | speedboat_id | col_about_speedboat_tests1 | col_about_speedboat_tests2 CarTests id | car_id | col_about_car_tests1 | col_about_car_tests2 GokartTests id | gokart_id | col_about_gokart_tests1 | col_about_gokart_tests2
这个结构的优点/缺点是什么,实现这样的优先方式是什么?
如果还有一些信息适用于您希望在车辆表中使用的所有车辆,该怎么办?那么CarTests表看起来像......
id | …
database-design polymorphic-associations class-table-inheritance
我正在试验PHP的Doctrine ORM(v1.2).我已经定义了一个班级"酒",有两个孩子类"杜松子酒"和"威士忌".我使用具体的继承(大多数文献中的类表继承)将类映射到三个单独的数据库表.
我试图执行以下操作:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Run Code Online (Sandbox Code Playgroud)
最初,我预计$ liquors是一个包含所有酒类的Doctrine_Collection,无论它们是威士忌还是杜松子酒.但是当我执行代码时,我得到一个空集合,尽管在威士忌和杜松子酒数据库表中有几行.基于生成的SQL,我理解为什么:ORM查询"酒"表,而不是存储实际数据的威士忌/杜松子酒表.
请注意,当我将继承类型切换到列聚合(简单表继承)时,代码可以正常工作.
获取包含所有酒的Doctrine_Collection的最佳方法是什么?
更新
经过一些研究后,看起来我期待Doctrine UNION在幕后执行SQL 操作来组合"威士忌"和"杜松子酒"表中的结果集.
这称为多态查询.
根据此票证,Doctrine 1.x中不提供此功能.它注定要发布2.0版本.(另见CTI的 Doctrine 2.0文档).
因此,根据这些信息,解决这一缺陷的最简洁,最有效的方法是什么?切换到单表继承?执行两个DQL查询并手动合并生成的Doctrine_Collections?
我刚刚完成了使用Rails的Agile Web Development,第四版(http://pragprog.com/book/rails4/agile-web-development-with-rails)这本书,并且需要一些帮助来理解如何创建模型之间的亲子关系.我做了一些谷歌搜索并在StackOverflow上进行了搜索,并且总体上了解了单表继承和类表继承.
我有一堆关于档案馆藏中不同项目的元数据.大多数元数据对于所有对象都是相同的,例如,登录号,标题,描述,版权等.除了公共元数据之外,还存在仅适用于某些类型的项目的元数据,例如,照片需要保持跟踪物品是彩色还是黑白; 录音需要跟踪格式(CD,DAT,盒式磁带等)和持续时间; 文本材料需要跟踪页数; 等等
Class hierarchy
Item
|
+-----------+------------+
| | |
Photo SoundRecording Text
Run Code Online (Sandbox Code Playgroud)
由于我将拥有数千条记录,因此我将单表继承视为效率太低.我理解这里提到的类表继承的想法:http://martinfowler.com/eaaCatalog/classTableInheritance.html但我对如何在新的Ruby on Rails项目中实际实现它感到困惑.我是否将类表继承实现为多态关联(http://guides.rubyonrails.org/association_basics.html#polymorphic-associations)或我是否在错误的轨道上?
谢谢.
我目前正在开发一个Rails 3应用程序,看起来可能需要为几个模型使用类表继承.
这是一个简单的例子.
我有一个名为Person的类,它具有通用属性,如名称,电子邮件,密码,这些属性对应用程序中的所有类型的人都是通用的,并用于身份验证.
Person(或两种类型的人......),Driver和Passenger有两个子类.这两个子类共享Person的通用属性,但具有特定的附加属性,这些属性对于它们自身是唯一的.(例如,司机可以拥有许多车辆和许可证,但乘客不会)
在这种情况下,我如何实施CTI?我一直在看这里提供的一个例子:
http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading
但它没有推测如何从Driver或Passenger对象访问Person的公共属性,我对此有点困惑.
特别是,我想知道的是:
如果我正在更新驱动程序的属性,我如何轻松访问和更新父人员表上的相关属性?我是否必须挂钩到after_save回调并分离出哪个属性更新在哪里?或者有更好的方法来解决这个问题吗?
如果我有一个叫动物的类,狗和鱼是子类.动物具有称为"颜色"的属性.狗具有称为"尾长"的属性,并且鱼没有此属性.鱼具有称为"重量"的属性,狗没有这个属性.
所以,我想设计一个数据库来存储这些信息.我该怎么办?这是一些想法:
想法1:制作动物表,并且表格有类型,以找到什么样的动物,如果是狗,只需从狗桌得到结果.
Animal:color:String类型:int
类型:狗:0鱼:1
狗:TailLength:int
鱼:重量:int
想法2:只在数据库中存储Dog表和Fish表,删除动物表.
狗:颜色:字符串TailLength:int
鱼:颜色:字符串重量:int