对象的继承关系在数据库中的实现方式和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进行编程,那么可以参考这篇文章。
对象的继承关系在数据库中的实现方式和PowerDesigner设计相关推荐
- 数据库笔记——实体关系与数据库中存储的方式
实体间的关系: 一对一:如老公和老婆:一对多:如一个员工从属一个部门,一个部门拥有多名员工:多对多:一名老师有多名学生,一名学生有多名老师: 概念模型: Java中的实体类(JavaBean) 描述实 ...
- android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android
我只是试图让存储在我的JSON文件中的值,并将其保存到SQLite数据库:解析嵌套的JSON对象,并存储在数据库中的Android 这是我的JSON文件: { "list": { ...
- 用户密码在后台数据库中加密存储方式
常见的用户密码在后台数据库中加密存储方式 如何安全的存储用户密码 常见登录密码加密方式 JavaScript逆向实战:admin加密成WaQ7xbhc9TefbwK是什么加密算法?逆向思维考验.详细流 ...
- 业务中继承关系研究(数据库)
情景如下:一个学员有两类员工,老师和后勤人员.员工有id和姓名,老师还额外有个授课学科,用OO来表达如下 class Staff{private String id;private String na ...
- javascript中的对象之间继承关系
相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...
- php对象好用吗,在数据库中使用对象的好处_php
我们都知道如何从mysql获取我们需要的行(记录),读取数据,然后存取一些改动.很明显也很直接,在这个过程背后也没有什么拐弯抹角的.然而对于我们使用面对对象的程序设计(OOP)来管理我们数据库中的数据 ...
- 在数据库中修改计价方式
由于初始的时候对存货档案选择计价方式设置错误选择了"个别计价法",现在想改为"全月平均法",月结之后在存货档案中是无法修改的,只能从数据库中修改. update ...
- 常见的用户密码在后台数据库中加密存储方式
转载自:https://blog.csdn.net/ctrip_tech/article/details/80125741 一.用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什 ...
- perl mysql 数据推拉_科学网—从MySQL数据库中提取序列并进行引物设计的perl脚本 - 闫双勇的博文...
利用MySQL数据库来储存序列,通过perl脚本获取序列,并进行引物设计.当然除了引物设计干其它事情也是可以的. 将FASTA文件导入MySQL数据库的方法: bp_seqfeature_load.p ...
最新文章
- 特斯拉“纯视觉路线”能去掉ISP吗?
- php bc函数库,PHP高精确度运算BC函数库实例详解
- 华为汪涛:定义5.5G,构建美好智能世界
- 批评“古风”歌词“狗屁不通”就是不尊重?我们又都成了“垃圾听众”
- 成功解决AttributeError: 'DataFrame' object has no attribute 'reshape'
- jzoj4228-C【dp】
- 别人家的地铁!长沙地铁全面进入5G时代 下载速率达1Gbps
- Python3之文件的读、写、修改操作
- C#正则表达式 — 正则表达式类
- 心语收集7:这就是人生,不要只顾着往前冲,要记得看看周围的景色,要想着你能留下点什么。...
- 中国计划建设自己的卫星导航系统
- jsweet下载编译
- 基于Pytorch对凸函数采用SGD算法优化实例(附源码)
- WindowsServer2008R2安装中文语言包截图详细教程(附语言包下载资源)
- matlab系统辨识工具箱的使用
- 复联4里的钢铁侠原型是谁?(剧透警告慎入)
- android SharePreference缓存存储List<Bean>
- U盘加密软件测试自学,TrueCrypt加密软件的相关技巧与问题
- 用计算机玩游戏的视频教程,让桌面上同时操作游戏和显示视频的技巧-电脑教程...
- slave-pending-jobs-size-max导致主从延迟
热门文章
- mysql中如何操作字符串_mysql 字符串操作
- docker-compose配置redis服务
- oracle var/tmp,关于/var/tmp/.oracle 目录(ZT)
- linux提取字符串特定结果
- java enum 定义属性_java enum(枚举)使用详解 + 总结
- c语言数码管编写程序,跪求单片机0~99数码管显示用C语言编写的程序
- CSS学习17之动画
- signature=0e42fe6b348b65f88748ba8ecefece12,Low power BIST
- 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
- error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值