原文:对象的继承关系在数据库中的实现方式和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对这三种继承的配置方法。

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

  1. javascript中的对象之间继承关系

    相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...

  2. OpenCascade拓扑对象之:拓扑对象方向继承关系

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  3. 如何将数据库中的表导入到PowerDesigner中

    1.        打开PowerDesigner12,在菜单中按照如下方式进行操作file->Reverse Engineer->DataBase 点击后,弹出 New Physical ...

  4. 从零认识 DOM (一): 对象及继承关系

    先上图为敬! 说明: 图中包括了大部分 DOM 接口及对象, 其中: 青色背景为接口, 蓝色背景为类, 灰色背景表示为 ECMAScript 中的对象 忽略了一部分对象, 包括: HTML/SVG 的 ...

  5. Hibernate 由实体类与配置文件的配置关系生成数据库中的表

    import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...

  6. UPDATE 在不同数据库中的使用方式

    MYSQL 中update 表一 set Gmoney = 表二.列名 from 表一,表二 where 表一.EMPID = 表二.EMPID举例:update table1 set table1. ...

  7. 存在继承关系的Java类对象之间的类型转换(一)

      类似于基本数据类型之间的强制类型转换. 存在继承关系的父类对象和子类对象之间也可以 在一定条件之下相互转换. 这种转换需要遵守以下原则: 1.子类对象可以被视为是其父类的一个对象2.父类对象不能被 ...

  8. Python-wxpy继承关系

    聊天对象 通过机器人对象 Bot 的 chats(), friends(),groups(), mps() 方法, 可分别获取到当前机器人的 所有聊天对象.好友.群聊,以及公众号列表. 而获得到的聊天 ...

  9. 面向对象设计之------Is-A(继承关系)、Has-A(合成关系,组合关系)和Use-A(依赖关系)(转)

    原文url:http://blog.csdn.net/loveyou128144/article/details/4749576 @Is-A,Has-A,Use-A则是用来描述类与类之间关系的.简单的 ...

随机推荐

  1. Color About——First

    最近在Android开发学习中遇到TextView背景色以及文字颜色着色问题,在此做个记录. 首先对于颜色的选择,我推荐W3C School,上面有对网页颜色的详尽说明以及实例,还提供了对于,同一种颜 ...

  2. 基于Redis主从复制读写分离架构的Session共享

    1.搭建主从复制 第一步:将Redis拷贝到虚拟机上的指定文件夹内,此Redis作为主服务 第二步:将Redis拷贝到本机的指定文件夹内,此Redis作为从服务 第三步:修改主服务的配置文件(redi ...

  3. MongoDB Long/Int(长整型)的自增长主键 解决方案

    今朝有幸尝芒果,发现自增长ID类型有多种,唯独没有Long/Int. 一思路:1. 自建一个Collection(表,假设名为:IdentityEntity,其中字段:_id, Key, Value, ...

  4. 每日一“酷”之bisect

    作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...

  5. linux常用命令收集(持续中)

    mv  :  既可以重命名,又可以移动文件或文件夹 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录的话也是 ...

  6. Oracle 主键

    给student 表产生 自增的序列主键 increment ; ----IBATIS简单入门教程http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2 ...

  7. oracle作业

    http://blog.csdn.net/hao_ds/article/details/38382931 oracle作业各种参数的详细介绍

  8. iOS 进阶 第十二天(0413)

    0413 - Quartz2D 使用Quartz2D画图形步骤:(drawRect: 方法 是 在view第一次显示到屏幕上的时候会调用一次.是系统主动去掉用的,不能直接调用.那么问题来了,比如我要通 ...

  9. How to Implement Bluetooth Low Energy (BLE) in Ice Cream Sandwich

    ShareThis - By Vikas Verma Bluetooth low energy (BLE) is a feature of Bluetooth 4.0 wireless radio t ...

  10. SCRUM团队的三个角色

    Scrum团队中包括三个角色,他们分别是产品负责人.开发团队和 Scrum Master. Scrum 团队是自组织.跨职能的完整团队.自组织团队决定如何最好地完成他们的工作,而不是由团队外的其他人来 ...