关于继承映射
1 每个类分层结构一张表(Table per class hierarchy)
<!-- 不同记录用鉴别字段来区分类型 -->
<discriminator column="computer_type"></discriminator><subclass name="PC" discriminator-value="P"><property name="component"></property></subclass>
采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段, 如component,不能有非空(NOT NULL)约束。
优点:这样做的优点包括只有一张表查询简单以及容易与其他表进行关联 ,策略的性能调优要比其他策略容易得多,比较适合做数据仓库系统 ,因为所有数据在一张表里面 不需要做关联。
缺点:如果子类的属性过多 就会用很多 为null的属性 这为基于行的SQL调优增加了难度,SIG系统中使用了分区解决这个问题
2 每个子类一张表(Table per subclass)
<joined-subclass name="PC" extends="Computer" table="t_pc"><key column="computer_id"></key><property name="component"></property></joined-subclass><joined-subclass name="NoteBook" extends="Computer" table="t_notebook"><key column="computer_id"></key><property name="duration"></property></joined-subclass>
需要四张表。三个子类表通过主键关联到超类表(因而关系模型实际上是一对一关联)。
优点:包括数据表比较紧凑(没有不需要的可空字段),数据跨三个子类的表进行分区,容易使用超类的表与其他表进行关联。紧凑的数据表可以针对基于行的数据库做存储块优化,让SQL执行得更好。数据分区增加了数据修改的并发性(除了超类,没有热点),OLTP系统通常会更好些
缺点:在所有策略中它使用的表和表连接最多
3 每个具体类一张表(Table per concrete class)
要用到的关键字<union-subclass>注意主键id不能重复
<class abstract="true"> -->不建父类表
<!-- 继承映射,方案三,每个具体子类各自存放一张表 -->
<class name="Computer" abstract="true"><union-subclass name="PC" extends="Computer" table="t_pc"><property name="component"></property></union-subclass><union-subclass name="NoteBook" extends="Computer" table="t_notebook"><property name="duration"></property></union-subclass></class></class></union-subclass>