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

class Staff{private String id;private String name;
}
class Teacher extends Staff{private String subject;
}

首先第一个问题是否要专门建一个后勤员工这个类.应该是很有必要的.从类的角度来看即使一个类拥有另一个内的所有方法也并不意味着相同方法类的内部实现会相同.如果把这个方法写到父类则有些不妥.

那么下一个问题是数据库如何设计.一般有三类方案

方案一:为父类建一张表,提供子类所有的字段然后再加上一个标识来表明是哪个子类.那么这张表将有很多字段并且可能很多字段的值都是空的.有的时候可以明确知道join的是老师那么也需要join员工这个大表,影响性能

方案二:为每个子类建立一张表.这样不会有冗余字段但带来的问题是查询时会有union操作,也会影响性能,并且无法做外键约束

方案三是上面两种方案的综合.创建N+1张表,为每个子类创建一张表,再为那些公共字段创建一个表也就是父表.至于子类表是否需要冗余存储父类表的字段则可以再分为方案3.1和方案3.2我的看法是根据查询需要来,尽量不要出现父类表join子类表的情况.但这只是继承关系只有一级的情况,万一由来个班主任继承Teacher,那就是(M(N+1)+1)张表了.几乎所有类,不管是父类还是子类都需要有一张表.

对于postgresql由于原生的提供了inherit的概念,所以在上面第三个方案上只需要真子类的NM张表,而不需要父类M+1表.真实的存储应该是和方案二类似,也就是查父类表的时候通过union子类来实现的,只是数据自动帮我们完成了这个视图.这也意味着有这方面的性能损失.postgresql的inherit还支持多重继承,这就解决了一些在java中要靠接口来解决的问题.

在前一个问题的后面还有一个紧密跟着的问题:对于一些字段和父类一样的子类是否需要专门建立一张表呢?如果从数据的角度来看我认为是没必要的(但是类也许还是需要一个专门的类,毕竟类是处理写操作的)

随着数据库对json的支持加强(其实不支持也可以),方案四应运而生,这里有点违背设计范式:将整个对象序列化为json然后存入数据库的一个json类型字段(其实text也可以),这样做的缺点是查询的时候稍稍麻烦点

业务中继承关系研究(数据库)相关推荐

  1. java中parent结构_详解java中继承关系类加载顺序问题

    详解java中继承关系类加载顺序问题 实例代码: /** * Created by fei on 2017/5/31. */ public class SonClass extends ParentC ...

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

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

  3. 我的心像洋葱,需要一层一层剥开,你才明白这颗心多爱你:Abstract中继承关系中,变量初始化与构造方法的关系

    package cm.abstracts.limit;//这个类用来财务室:在任何一个类的构造执行完之前,所有属性的内容都是其对应数据类型的默认值 public class CaseFfourtyFo ...

  4. Shutdown Abort :亚马逊成功迁移物流业务中最后一个Oracle数据库

    本文彩蛋: 今天是世界读书日,"数据和云"公众号(ID:OraNews)赠送五本精美书籍,参与活动即送:世界读书日送你畅销好书! 亚马逊和甲骨文公司之间的技术冲突常常是戏剧化的,A ...

  5. azure上传excel_使用MS Excel访问Azure中的关系SQL数据库

    azure上传excel 介绍 (Introduction) There are great Microsoft tools to access to SQL Server in Azure. How ...

  6. Java中继承关系的构造函数的调用顺序

    情况一:在JAVA中,我们通常把C中的函数叫做方法.对于子类调用父类的构造方法可以做出如下解释: 子类无条件地继承父类的不含参数的构造方法.如果一个类中没有构造函数的话编译器会默认为该类创建一个无参空 ...

  7. Hibernate中的Entity类之间的继承关系之一MappedSuperclass

    在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...

  8. 知识库问答中的关系识别研究回顾

    ©PaperWeekly 原创 · 作者|舒意恒 学校|南京大学硕士生 研究方向|知识图谱 知识库是用于知识管理的特殊数据库,通常由大量三元组构成,三元组形如(奥巴马,出生于,火奴鲁鲁),三者分别是三 ...

  9. 亚马逊消费者业务宣布永久关闭 Oracle 数据库,去O新进展;华为发布最新5G全系列解决方案;苹果正研究新设备“智能戒指”……...

    戳蓝字"CSDN云计算"关注我们哦! 嗨,大家好,重磅君带来的[云重磅]特别栏目,如期而至,每周五第一时间为大家带来重磅新闻.把握技术风向标,了解行业应用与实践,就交给我重磅君吧! ...

最新文章

  1. 随笔(很晚很晚,瞎写一通)
  2. QT Creater/VS2013的使用(快捷键,调试等)
  3. dakai微信小程序 ios_iOSAPP跳转微信小程序
  4. 取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言
  5. 用Ventoy同时引导ubuntu/centos/windows多系统安装
  6. 三消游戏核心逻辑的一种实现
  7. edge浏览器主页被360篡改如何修改?
  8. [c++]巧用stl库-啤酒与尿布
  9. 分享一个CCLE细胞系数据(CCLE数据库不能用了吗?)
  10. 数据结构与算法笔记:贪心策略之BSTBBST, Hashtable+Dictionary+Map, Priority Queue~Heap, Minium Spanning Tree
  11. 【转自杨建荣博客】通过执行计划中的CONCATENATION分析sql问题
  12. 《2022中国RPA采购指南》报告正式发布
  13. 骷髅创意设计灵感_20种创意旅行应用程序设计,激发您的灵感
  14. 严重的编程错误或致文件删除、黑客使用新恶意软件逃避检测|1月26日全球网络安全热点
  15. win7 64蓝牙耳机连接问题
  16. Java 环境变量的配置的详细教程(Windows 10)
  17. java弹力球游戏_小班弹力球游戏教案
  18. 诺基亚5800XM深度测
  19. Python入门练习选择题
  20. 北斗导航 | GBAS:双星座/双频点 CAT II/III 完好性(DC/DF GBAS Integrity)

热门文章

  1. 告别无聊的log:让你的Logcat 输出多彩日志
  2. 计算机无法对NAS硬盘操作,群晖NAS联机失败不要慌,我用经验告诉你,这样做就能完美解决...
  3. 离散数学——范式(一)定义与求解
  4. RHEL5 Oracle 11G R2 RAC 静默安装 (一) GI安装前 准备
  5. C#栈的实现(数制转换)
  6. ps奥顿柔焦效果+提取线稿
  7. 6个高清图片素材网站,找图片素材就靠他们了
  8. 安超云生态 | 安超云与杉岩数据完成产品互兼容认证 携手打造协同生态
  9. Elasticsearch之中文分词器插件es-ik的自定义热更新词库
  10. 【毕业设计系列】033:基于MATLAB语言的实时变声器系统【含Matlab源码】