继承关系在内存和DB中的映射
- 使用
- 将若干相似的类映射为单表,对拥有许多特殊数据的类使用具体表继承.
- 对高层次使用类表继承,对低层次使用具体表继承.
- Single Table Inheritance
- 在DB中将类继承层次设计为一个单表,表中各列代表不同类中的所有域.
- 运行机制
- 每个类负责把与之相关的数据保存在表的一行中.表中其它不相关的列留空.
- 通过表中的Type字段来决定向内存中加载对象时,应该实例化那个类来创建该对象.
- 可以直接使用类名称
- 或者需要经过翻译的Code域.
- 保存数据的代码可以由层超类负责.
- 使用时机
- 优点
- 只需要关注一个DB表.
- 获取数据时不必进行连接.
- 对继承层次的重构(在父子之间挪动某个域)不需要修改DB.
- 缺点
- DB表的列和对象的域不是一一对应的.
- 空间的浪费.
- 可能太大的单表.过多的索引被频繁上锁.导致访问效率低下.
- 域名称可能重复(加上类名做区分可以解决).
- 优点
- Class Table Inheritance
- 每个DB来代表一个类.
- 运行机制
- 类中的域直接映射到相应表中的字段上.
- 表的行链接问题
- 使用公用的主键.由于超类表针对其它子类表中的每一行都有对应的一行.所以主键必须在各表间唯一.
- 每个表都有自己的主键,并使用超类表的外键把各行联系在一起.
- 最大的问题是如何有效地把数据从多个表中取回.
- 对每个表都进行一次调用会造成多次调用.
- 一次链接来处理多个表,会在表数目较大时,产生性能问题.
- 通常,对于指定的查询,并不清楚具体需要链接那些表.如查询一组运动员.
- 使用外链接来在某些表没有数据时有效地进行链接.
- 先读根表,然后找出下一个该读取的表.但是这样会有多次查询.
- 使用时机
- 优点
- DB表更容易理解,且没有空间浪费.
- 领域模型和DB之间的关系简单明了.
- 缺陷
- 加载一个对象需要访问多个表(也就是需要链接)
- 字段在继承层次中上下移动会导致DB重构.
- 对超类的频繁访问会导致瓶颈.
- 优点
- Concrete Table Inheritance
- 内存中的每一个具体类对应一个DB表.
- 运行机制
- Db表中的列包含着具体类和其所有祖先类中的所有域.超类中的所有域在子类的DB表中都会被复制.
- 需要保证键在继承层次中所有的表键都是唯一的.
- 需要一个键分配系统来记录表间键的使用情况.
- 要么避免使用超类的域,要么使用包含表ID的复合键.
- 引用完整性问题
- 例如,慈善活动和Player的关联.由于没有Player对应的Db表.所以无法使用外键来构建链接表.
- 此时,可以忽略引用完整性.
- 或者,使用多链接表.DB中的每个表都有一个链接表与之对应.
- 使用时机
- 优点
- 每个DB表都是自包含的,并且不含有不相关的域.
- 具体映射器读取数据时不需要链接操作.
- 只有在类被访问时,对应的DB表才会被访问.分散了访问负载.
- 缺陷
- 主键很难处理.
- 不能把数据库关系加到抽象类中.
- 域在继承树上移动时,须更改表定义.
- 超类的域改变时,会有很多的子类DB表连带更改.
- 超类上的一次查找需要检查所有表.
- Inheritance Mapper
- 运行机制
- 查找方法定义在具体子类上,因为它要返回一个具体类.OO不允许改变已声明方法的返回值类型.
- 基本行为:在DB中找到合适的行,实例化正确类型的对象(子类决定),并用来自DB的数据来加载对象.
- 子类映射器在加载子类特有的数据后,一直向上调用它的超类方法.
- 插入和更新
- 都使用保存方法.可以在超类上定义接口.
- 插入:创建一个新行,将对象中的数据用Save钩子方法保存起来.
- 更新:值保存数据,也使用Save钩子方法.
- 与加载类似,每个类保存其特有的数据,之后调用超类的保存方法.
- 一个支持保存和加载的抽象类
- Abstract Player映射器负责向DB中加载和保存特定的Player数据.
- 它是一个抽象类.其行为只有具体的映射器子类使用.
- 独立的Player映射器.
- 提供了操作的接口.
- 提供了查找方法.
- 覆盖了插入和更新方法.
- 其只负责找到应该处理某个具体任务的具体映射器,并把任务委托给该具体映射器.
- Abstract Player映射器负责向DB中加载和保存特定的Player数据.
- 查找方法定义在具体子类上,因为它要返回一个具体类.OO不允许改变已声明方法的返回值类型.
- 运行机制
继承关系在内存和DB中的映射的更多相关文章
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
- C++中继承 声明基类析构函数为虚函数作用,单继承和多继承关系的内存分布
1,基类析构函数不为虚函数 #include "pch.h" #include <iostream> class CBase { public: CBase() { m ...
- C++各种类继承关系的内存布局
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...
- (转)Python异常类的继承关系
原文:https://blog.csdn.net/Dragonfli_Lee/article/details/52350793 https://www.cnblogs.com/Lival/p/6203 ...
- Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)
Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...
- Pycharm 查看一个类的继承关系图
Pycharm 查看一个类的继承关系图 在我们开发过程中: 无论是使用的开发框架自带的类, 还是我们自定义的类都特别多; 并且类之间单继承和多继承频繁使用, 这个继承,不仅仅是一级的继承关系,包括好几 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (9) -----第二章 实体数据建模基础之继承关系映射TPH
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-10 Table per Hierarchy Inheritance 建模 问题 ...
随机推荐
- 放肆的使用UIBezierPath和CAShapeLayer画各种图形
CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 杂谈 在 CAShapeLayer 中,也可以像 CAL ...
- mysql开启慢查询方法(转)
1,配置开启 Linux: 在mysql配置文件my.cnf中增加 log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会 ...
- RSA非对称算法(转)
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解.我们经 ...
- __attribute__((unused))
在gcc手册中找到了有关的解释: unused:This attribute, attached to a function, means that the function is meant to ...
- Android 在onActivityResult()中设置图片setImageResource(resId) 或者改变view属性,不成功的解决办法
如果试验过的朋友就会发现,在onActivityResult()中设置这些属性,好像都不工作,虽然我死磕一番还是不知道具体原因,我直接默认它可能就是不能在里面设置,所以就只能在其他地方设置,幸好发现A ...
- 如何利用log4Net自定义属性配置功能记录完整的日志信息
log4Net作为专业的log记录控件,对于它的强大功能大家一定不陌生.下面我将详细介绍如何利用其自定义属性,让日志信息更完整. 一,创建测试工程,log4Net组件可以自己从网上下载,也可通过Nug ...
- 1.4.6 其他Schema元素
这里描述了schema.xml中的其他几个重要的元素. 唯一主键-Unique Key uniqueKey元素一篇文档的唯一标记,它几乎总是保证您的应用程序设计,例如,如果你更新索引中的文档,需要用到 ...
- 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...
- 基于Jquery Validate 的表单验证
基于Jquery Validate 的表单验证 jquery.validate.js是jquery下的一个验证插件,运用此插件我们可以很便捷的对表单元素进行格式验证. 在讲述基于Jquery Vali ...
- 精通C#(第6版)
<精通C#(第6版)> 基本信息 原书名:Pro C# 5.0 and the .NET 4.5 framework,sixth edition 作者: (美)Andrew Troelse ...