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

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

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

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


1.具体表继承。

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


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


2.单表继承。

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


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


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

3.类表继承。

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


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


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

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

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

时间: 2024-11-08 21:12:35

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

对象序列化存放-C# 序列化的对象 如何能存放到数据库中?

问题描述 C# 序列化的对象 如何能存放到数据库中? 我声明一个可序列化的对象 ,如何能讲对象存到数据库的字段中?存放后怎么读? 解决方案 参考:http://wenku.baidu.com/link?url=cIlCf5XteiSXDPFFX7mEJyf7uCBuy1I_UxksFGcfd7AKRrSLdPYv5NHLZtoyhQCc67Nl2bq9rRrrsP5Lq7UiTtgR1ESHL9mlTawT0t8jULC http://blog.csdn.net/chenbin520/artic

在我使用vb.net-acess通过dataAdapter对象的insertcommand属性向数据库中添加纪录时, 运行的时候老是出现字符串语法错误的提示,不

问题描述 在我使用vb.net-acess通过dataAdapter对象的insertcommand属性向数据库中添加纪录时,运行的时候老是出现字符串语法错误的提示,不知道哪里出了问题.求解答!!急十分感谢!!主要代码:类:SharedFunctionadd()AsStringDiminsvalAsString="'"&stuname&"','"&stusex&"','"&stuhousenum&&

数据库中数据项变化不定时如何设计Java Beans

前言 我们不只一次抱怨信息系统中数据项变化不定,无法设计和实现Java Beans.我们也不只一次作过这样的事情:数据项增加或减少了,我需要修改信息系统以求适应.我们对付这种变化莫定的需求还有一招:天天催企业领导或业务人员决定数据项,而不开始下面的设计和开发,还美名其为一个需求的"需求里程碑"没到,至少这个需求相关的设计和开发绝对不能开始.本文为这种情况提供了一种解决办法,并美名其为"以动制动". JavaBean属性 Java Beans 作为一种组件技术,其结构

java中变量和对象之间的关系问题

问题描述 java中变量和对象之间的关系问题 java中变量和对象之间的关系问题 是对象属于变量,还是变量属于对象 它们是充要的还是充分不必要还是必要不充分的 我不是上面的数学逻辑属于适合不适合描述对象和变量之间的关系 解决方案 一般来说,变量类型会叫基本类型,比如Integer等,还有就是对象变量,就是引用对象的变量. 对象中可以定义变量.

精通Hibernate之映射继承关系五

本节的范例程序位于配套光盘的sourcecode\chapter14\14.2目录下,运行该程序前,需要在SAMPLEDB数据库中手工创建COMPANIES表和EMPLOYEES表,然后加入测试数据,相关的SQL脚本文件为/14.2\schema\sampledb.sql. 在DOS命令行下进入chapter14根目录,然后输入命令: ant -file build2.xml run 就会运行BusinessService类.BusinessService的main()方法调用test()方法,

PHP中类的继承关系

原文:PHP中类的继承关系 在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就能得到相应的功能.假设大致有这么一个父类: 1 <?php 2 class Father{ 3 4 public function __construct(){ 5 echo '我是父类的构造方法!'; 6 } 7 8 protected function say($str = 'Hello World!'){ 9 echo '说了一句话:' . $str; 10 } 11 } 12 ?> 然后呢,

JavaScript中的对象继承关系_javascript技巧

我们今天就来看一下继承中的类继承以及类继承和原型继承的混用,所谓类继承,就是使用call或者apply方法来进行冒充继承: function Desk(size,height){ this.size=size; this.height=height; } function MJDesk(size,height){ Desk.call(this,size,height);//这种就叫类继承. } var mj = new MJDesk(10,123); 像上面这种就是我们要使用的类继承,用这种继承

在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?

在<实现存储过程的自动映射>中,我通过基于T4的代码生成实现了CUD存储过程的自动映射.由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景.如果两种模型存在差异,在进行数据更新操作的时候就会出错.本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程. 目录 一.创建具有继承关系的实体 二.基于继承关系实体的查询与更新 三.映射标准的CUD存储过程 四.修正存储过程 一.创建具有继承关系的实体 假设数据库中有如下两个

ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表

ORM中的继承关系映射全解--单表继承体系.一实体一具体表.一实体一扩展表.接口映射 本文涉及的内容包括: 1.单表继承体系 2.一实体一具体表 3.一实体一扩展表 4.接口实现映射vs基类继承映射 1.单表继承体系 所谓单表继承体系就是用一张数据库表存储整个继承体系中的所有实体的数据.单表继承体系适合那种继承体系中实体数目相对较少,总记录数相对较少,子类对父类的属性扩展也相对较少的情形. 单表继承体系优点是读/写继承体系中的每个实体的数据,都只需操作一张表,性能较好,并且,新增继承类,或扩展实