对象的继承关系在数据库中的实现方式和PowerDesigner设计
2015-04-10 08:37
531 查看
【出自博客园深蓝居,转载请注明作者出处】
在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统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进行编程,那么可以参考这篇文章。
【出自博客园深蓝居,转载请注明作者出处】
在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统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设计
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- 高性能数据库的访问,java程序员心中永远的痛(JDBC访问数据库的4中方式及数据库连接池中间件的设计和实现)(1)
- 对象继承结构到设计数据表方式谈
- javascript面向对象中的对象创建、继承、封装等实现方式
- ASP.NET网站权限设计实现(一)——使用PowerDesigner进行数据库设计
- Hibernate继承关系映射(了解),实现反向生成数据库表的过程
- 利用prototype属性自定义对象,实现对象继承等面向对象设计
- 面向对象里面使用use-a, has-a, is-a和实现关系支持优秀的设计
- js对象继承的实现的几种方式
- 用命令模式实现对象存储——对象与关系数据库
- 使用混合方式实现javascript中对象的继承(推荐使用)
- 【原创+探讨+分享】关于有继承关系的抽象类实现方式的初步探讨
- UML 类图. 对象图. 接口图. 用例图 .包,参与者. 依赖关系. 泛化/继承关系. 关联关系 .聚合/聚集关系. 实现关系 组合关系。
- 高性能数据库的访问,java程序员心中永远的痛(JDBC访问数据库的4中方式及数据库连接池中间件的设计和实现)(2)
- UML 类图. 对象图. 接口图. 用例图 .包,参与者. 依赖关系. 泛化/继承关系. 关联关系 .聚合/聚集关系. 实现关系 组合关系。