在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统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进行编程,那么可以参考这篇文章。

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

  1. 数据库笔记——实体关系与数据库中存储的方式

    实体间的关系: 一对一:如老公和老婆:一对多:如一个员工从属一个部门,一个部门拥有多名员工:多对多:一名老师有多名学生,一名学生有多名老师: 概念模型: Java中的实体类(JavaBean) 描述实 ...

  2. android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android

    我只是试图让存储在我的JSON文件中的值,并将其保存到SQLite数据库:解析嵌套的JSON对象,并存储在数据库中的Android 这是我的JSON文件: { "list": { ...

  3. 用户密码在后台数据库中加密存储方式

    常见的用户密码在后台数据库中加密存储方式 如何安全的存储用户密码 常见登录密码加密方式 JavaScript逆向实战:admin加密成WaQ7xbhc9TefbwK是什么加密算法?逆向思维考验.详细流 ...

  4. 业务中继承关系研究(数据库)

    情景如下:一个学员有两类员工,老师和后勤人员.员工有id和姓名,老师还额外有个授课学科,用OO来表达如下 class Staff{private String id;private String na ...

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

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

  6. php对象好用吗,在数据库中使用对象的好处_php

    我们都知道如何从mysql获取我们需要的行(记录),读取数据,然后存取一些改动.很明显也很直接,在这个过程背后也没有什么拐弯抹角的.然而对于我们使用面对对象的程序设计(OOP)来管理我们数据库中的数据 ...

  7. 在数据库中修改计价方式

    由于初始的时候对存货档案选择计价方式设置错误选择了"个别计价法",现在想改为"全月平均法",月结之后在存货档案中是无法修改的,只能从数据库中修改. update ...

  8. 常见的用户密码在后台数据库中加密存储方式

    转载自:https://blog.csdn.net/ctrip_tech/article/details/80125741 一.用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什 ...

  9. perl mysql 数据推拉_科学网—从MySQL数据库中提取序列并进行引物设计的perl脚本 - 闫双勇的博文...

    利用MySQL数据库来储存序列,通过perl脚本获取序列,并进行引物设计.当然除了引物设计干其它事情也是可以的. 将FASTA文件导入MySQL数据库的方法: bp_seqfeature_load.p ...

最新文章

  1. 特斯拉“纯视觉路线”能去掉ISP吗?
  2. php bc函数库,PHP高精确度运算BC函数库实例详解
  3. 华为汪涛:定义5.5G,构建美好智能世界
  4. 批评“古风”歌词“狗屁不通”就是不尊重?我们又都成了“垃圾听众”
  5. 成功解决AttributeError: 'DataFrame' object has no attribute 'reshape'
  6. jzoj4228-C【dp】
  7. 别人家的地铁!长沙地铁全面进入5G时代 下载速率达1Gbps
  8. Python3之文件的读、写、修改操作
  9. C#正则表达式 — 正则表达式类
  10. 心语收集7:这就是人生,不要只顾着往前冲,要记得看看周围的景色,要想着你能留下点什么。...
  11. 中国计划建设自己的卫星导航系统
  12. jsweet下载编译
  13. 基于Pytorch对凸函数采用SGD算法优化实例(附源码)
  14. WindowsServer2008R2安装中文语言包截图详细教程(附语言包下载资源)
  15. matlab系统辨识工具箱的使用
  16. 复联4里的钢铁侠原型是谁?(剧透警告慎入)
  17. android SharePreference缓存存储List<Bean>
  18. U盘加密软件测试自学,TrueCrypt加密软件的相关技巧与问题
  19. 用计算机玩游戏的视频教程,让桌面上同时操作游戏和显示视频的技巧-电脑教程...
  20. slave-pending-jobs-size-max导致主从延迟

热门文章

  1. mysql中如何操作字符串_mysql 字符串操作
  2. docker-compose配置redis服务
  3. oracle var/tmp,关于/var/tmp/.oracle 目录(ZT)
  4. linux提取字符串特定结果
  5. java enum 定义属性_java enum(枚举)使用详解 + 总结
  6. c语言数码管编写程序,跪求单片机0~99数码管显示用C语言编写的程序
  7. CSS学习17之动画
  8. signature=0e42fe6b348b65f88748ba8ecefece12,Low power BIST
  9. 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
  10. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值