标签: class-table-inheritance

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

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

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

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

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

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

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

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

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

sql database inheritance database-design class-table-inheritance

209
推荐指数
5
解决办法
9万
查看次数

不能使用<union-subclass>生成标识列密钥(TABLE_PER_CLASS)

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)

inheritance hibernate jpa class-table-inheritance

88
推荐指数
3
解决办法
5万
查看次数

我们如何实施IS-A关系?

我们通过将一个Table的PK作为FK添加到另一个表来实现一对多关系.我们通过将第2个表的PK添加到第三个表来实现多对多关系.

我们如何实施IS-A关系?

实体是技术人员和行政人员,均为员工.我可以在表EMPLOYEE中使用额外的字段(id,name,surname,role,... AdminFields ...,... TechFields ......)

但我想探索IS-A选项.

编辑:我按照Donnie的建议,但没有角色领域.

sql database database-design class-table-inheritance

33
推荐指数
4
解决办法
5万
查看次数

数据库继承技术?

什么是提示/技巧,当你需要与继承,不支持继承关系数据库持久化类?

说我有这个经典的例子:

Person -> Employee -> Manager
                   -> Team lead
                   -> Developer
       -> Customer -> PrivilegedCustomer
                   -> EnterpriseCustomer
Run Code Online (Sandbox Code Playgroud)

有哪些设计数据库的技术?各有利弊?

PS我已经搜查,发现有关数据库继承的几个问题,但大多数是有关更改到支持它本身数据库引擎.但是,让我说我坚持使用SQL Server 2005 ......我的选择是什么?

database database-design class-table-inheritance

31
推荐指数
3
解决办法
2万
查看次数

如何在关系数据库中进行继承建模?

我的问题是关系数据库系统中的继承建模.我有规范的数据模型,并且我有一些与产品定价相关的字段,从产品表继承某些属性,我想在MySQL关系数据库中建模这种继承,所以,

"我们如何在关系数据库中进行继承建模?"

谢谢.

mysql database inheritance data-modeling class-table-inheritance

31
推荐指数
4
解决办法
4万
查看次数

像数据库设计中的继承之类的东西

假设您正在设置数据库来存储各种车辆的碰撞测试数据.您想存储快艇,汽车和卡丁车的碰撞测试数据.

您可以创建三个单独的表: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

25
推荐指数
2
解决办法
1万
查看次数

PHP doctrine 1.2 ORM - 具有类表继承的多态查询

我正在试验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?

php doctrine class-table-inheritance

15
推荐指数
1
解决办法
1562
查看次数

如何在Rails中实现类表继承?

我刚刚完成了使用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)或我是否在错误的轨道上?

谢谢.

ruby-on-rails class-table-inheritance

14
推荐指数
1
解决办法
3294
查看次数

Rails中的类表继承3

我目前正在开发一个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回调并分离出哪个属性更新在哪里?或者有更好的方法来解决这个问题吗?

class-table-inheritance ruby-on-rails-3

13
推荐指数
2
解决办法
1万
查看次数

如何在数据库中实现超类,子类关系?

如果我有一个叫动物的类,狗和鱼是子类.动物具有称为"颜色"的属性.狗具有称为"尾长"的属性,并且鱼没有此属性.鱼具有称为"重量"的属性,狗没有这个属性.

所以,我想设计一个数据库来存储这些信息.我该怎么办?这是一些想法:

想法1:制作动物表,并且表格有类型,以找到什么样的动物,如果是狗,只需从狗桌得到结果.

Animal:color:String类型:int

类型:狗:0鱼:1

狗:TailLength:int

鱼:重量:int

想法2:只在数据库中存储Dog表和Fish表,删除动物表.

狗:颜色:字符串TailLength:int

鱼:颜色:字符串重量:int

database database-design class-table-inheritance

11
推荐指数
1
解决办法
1万
查看次数