共享主键、外键、关联表在表达对象关联关系时的微妙语义差别
2010-11-17 23:24
309 查看
外键作为一种做用在表上的参照性约束,自然是要求表中所有纪录必须遵守此约束,而如果允许外键列为空,那就等同打开一个扇后门,允许某些数据不必遵守这一约束。这是与外键的初衷是相违背的。如果说:两张表之间的数据存在一种“部分”参照关系,也就是说的如果A表中有部分数据是需要参照B表中的数据,而有的则可以没有参照,那么,使用关联表对两张表之间的数据进行关联可能是更好的选择!这种关系的微妙之外在于,它即表明两表数据之间有“一定的”参照关系,但又不是必须的,它们也可以没有这种参照,显然,这表达的是一种更为宽松的关系,体现到对象间的关系上时,它可以表达一般意义上的关联关系,即A可以依赖于B(为至多个都可以),反之亦然。它不像外键约束,我们知道,外键约束最适用于描述的是父子关系:即:每一个孩子都必定有一个父亲(多对一,且非空),每一个父亲可能有0至多个孩子(一对多,可空。注:考虑到没有孩子的人不可以称之为父亲,因此说用父子关系形容这一类对象间关系也有一点点为妥)
对于关联表来说,除去上面所讲到的情况,通过给关联表中的外键设定唯一约束,还可以表达出“部分的”一对一关系,也即optional one-to-one,典型的例子就是桌子员工分配关系!
对于共享主键,可能描述的是最为严格的关系了:一对一,且双方均不得为空,并且同时存在,同时消亡,有同样的生命周期。像Thread和Subject Post之间的关系一样。
最后简单归纳如下:
对于共享主键方式:单向/双向一对一关系(关联双方均不可为空且有一致的生命周期)
外键方式:单向多对一(一端不能为空),单/双向一对一(通过对外键加唯一约束来模拟,同样外键所在一端不能为空)
关联表:双向一对一,一对多/多对一,(特别是单向一对多建议使用关联表),多对多
对于关联表来说,除去上面所讲到的情况,通过给关联表中的外键设定唯一约束,还可以表达出“部分的”一对一关系,也即optional one-to-one,典型的例子就是桌子员工分配关系!
对于共享主键,可能描述的是最为严格的关系了:一对一,且双方均不得为空,并且同时存在,同时消亡,有同样的生命周期。像Thread和Subject Post之间的关系一样。
最后简单归纳如下:
对于共享主键方式:单向/双向一对一关系(关联双方均不可为空且有一致的生命周期)
外键方式:单向多对一(一端不能为空),单/双向一对一(通过对外键加唯一约束来模拟,同样外键所在一端不能为空)
关联表:双向一对一,一对多/多对一,(特别是单向一对多建议使用关联表),多对多
相关文章推荐
- Java的Hibernate框架中的双向主键关联与双向外键关联
- Hibernate的关联映射---6.1.9: 基于复合主键的关联关系
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- 主键关联、外键关联的区别
- 浅析【数据库】 主键,外键,主表,从表,关联表,父表,子表
- hibernate在做一对多关联时,保存一方的对象,报出不能插入外键的错误的解决方法
- Hibernate高级实体关联映射之单值的实体关联(共享的主键关联)
- 1.一对一外键单向关联(人对身份证):对象,hbm
- mybatis一个表关联很多的表,好多是多对多的关联关系,有必要建关联对象么
- plsql中创建外键关联时的错误: ORA-02270: 此列列表的唯一或主键不匹配
- 获取外键关联的实体对象
- Hibernate annotation@OneToOne共享主键关联
- Hibernate 一对一共享主键关联的例子
- Hibernate 一对一关联映射(主键关联VS唯一外键关联)
- hibernate 关联关系 一对一 主键关联
- Hibernate之对象关系映射03一对一单向外键关联
- Hibernate 第十讲 表关联关系(三)单向项一对一主键关联
- 主键关联和外键关键
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- hibernate annotation方式配置实体关联关系,解决关联外键数据不存在时抛出异常的问题