对象的继承关系在数据库中的实现方式和PowerDesigner设计

原创 2012年03月31日 10:40:16

在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的关系,那么对于继承关系,该怎么在RDBMS中表示呢?一般来说有3种实现方式:

  • Concrete Table Inheritance(具体表继承)
  • Single Table Inheritance(单表继承)
  • Class Table Inheritance(类表继承)

比如在一个教务系统中,有老师学生2个对象,这两个对象都是“人”对象的子类,所以我们可以建立一个Person表,该表有人的公共属性:姓名、性别等,还有就是数据的唯一标识,一个ID。而教师对象有教师的特有属性,比如职称,学生有学生的特有属性,比如学号。所以我们可以建立Person、Teacher、Student3个表,其关系在PowerDesigner中如图所示:

image

1.具体表继承。

不建立父对象,将父对象的所有属性转移到子对象中,为每个子对象建立对于的表。如果使用这种方法,那么就只需要建立Teacher表和Student表,不需要Person表,在PowerDesigner中,双击继承节点,打开属性窗口,取消“Generate Parent”选项,选中“Generate children”并选择“Inherit all attributes”,如图所示:

image

生成的数据库表将如图所示:

image

2.单表继承。

在一个宽表中列出所有父对象和子对象的属性,同时用一个标识列表示该行数据存储的是哪个子类的数据。在PowerDesigner中,修改继承节点的属性,取消“Generate children”,选中“Generate parent”,然后在下面添加一个标识列,叫PersonType,如图所示:

image

生成的数据库表,在一个宽表中表示如图所示:

image

可以看到Person中的列集成了Person、Teacher、Student这3个表的所有列,同时还多了一个列PersonType,这个列就是用来区分这行数据到底表示的是一个学生还是一个老师。

3.类表继承。

对父对象和每个子对象建立一个对应的表,然后在子表中设置该子表的主键为与父表关联的外键。在PowerDesigner中,对于继承节点的属性,允许生成父和子表,另外,将“Inherit only primary attributes”选中。如图所示:

image

生成的数据库表如图所示:

image

这里可以看到,Teacher的主键和Student的主键同时又是该表的外键,连接到Person表。

PS:如果使用NHibernate进行编程,那么可以参考这篇文章,介绍了NHibernate对这三种继承的配置方法。

如果使用Entity Framework进行编程,那么可以参考这篇文章

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

对象的继承关系在数据库中的实现方式和PowerDesigner设计

在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的关系,那么对于继承关系,该怎么在RDBMS中表示呢?一般来说有3种实现方式...
  • jjting
  • jjting
  • 2012年10月12日 21:50
  • 1239

对象的继承关系在数据库中的实现方式和PowerDesigner设计

在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的关系,那么对于继承关系,该怎么在RDBMS中表示呢?一般来说有3种实现方式...

Spring MVC中带有继承关系或者含有对象的参数请求处理方式

如题意思就是在Spring MVC的路由方法中出现的参数是具有继承关系的,如下:(1)控制器代码如下:(2)QueryUserCond代码如下:(3)QueryBaseCond代码如下:Page是个分...

Effective c++(笔记)之继承关系与面向对象设计

Effective c++ 之 继承关系与面向对象设计 提到了在一堆classes中去辨别关系的准则,面向对象设计中容易产生的问题...

Hibernate继承关系映射(了解),实现反向生成数据库表的过程

一、继承关系映射(了解)

关系数据库数据模型设计及设计工具PowerDesigner中实现CDM(概念模型)设计并转化为PDM(物理模型)

声明:本博文即使自己学习知识的一种简单记录,方便自己使用,也是把自己在遇到问题,找到解决办法拿来与大家分享,方便大家学习中也会遇到同样的问题不知怎样解决提供一种方案,其中内容都出自笔者手稿,并经过亲身...

继承关系中对象创建过程加载顺序及方法重写

package javatest; import java.awt.color.ICC_ColorSpace; public class Animal { static { int a; Syste...

写几个带继承关系的类,使用直接强转的方式,以及使用as转换, 并且练习is的类型判断

接口IBaseA 、 IBaseB 和 IMyClass: interface IBaseA { void PrintBaseA(); } interfac...

【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序

一、派生类对象中基类构造函数和派生类中构造函数调用顺序(WIN7 64位 VS2012) (1)、先执行派生类的构造函数还是先执行基类中的构造函数? 利用下面这段代码进行打印测试 #include ...

【HIbernate框架学习】:Hibernate对象继承关系映射(二)

每个具体子类一张表        这种策略是使用union-subclass标签来定义子类的。每个子类对应一张表,而且这个表的信息是完备的,即包含 了所有从父类继承下来的属性映射的字段(这就是它跟jo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象的继承关系在数据库中的实现方式和PowerDesigner设计
举报原因:
原因补充:

(最多只允许输入30个字)