概念
将类的继承层次表示为一个单表,表中的各列代表不同类中的所有域
关系数据库不支持继承,因此把对象映射到数据库的时候必须考虑如何用关系数据库表来表现继承结构。
运行机制
- 使用一个表包含某个继承层次中所有类的所有数据,每个类负责把自己的数据保存到表中的一行中.
- 使用一个域来标识加载对象时,需要实例化的类.这个域可能是代码类,也可以是文本的类名.
- 加载数据时首先读代码,看看需要实例化哪个类.保存数据的时候代码需要由层次关系中的超类写出.
使用时机
优点:
- 在数据库中只关注一个表;
- 获取数据时不必进行连接操作;
- 任何对继承层次的重构都不需要修改数据库
缺点:
- 数据库表中的列有时对应到对象域有时没有对应;
- 只被某些子类使用的列带来数据库空间的浪费;
- 单表可能最终过大,索引多并被频繁上锁导致效率低下;
- 所有域只有一个名字空间,需要区分.
示例-运动员的单表(C#)
Step1 :所有域都放到抽象类中
Step2 :通过一系列加载方法把数据加载到新对象,如CricketerMapper:
Step3 :最后采用运动员映射器处理