文档章节

共享主键、外键、关联表在表达对象关联关系时的微妙语义差别

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 659
阅读 6
收藏 0

      外键作为一种做用在表上的参照性约束,自然是要求表中所有纪录必须遵守此约束,而如果允许外键列为空,那就等同打开一个扇后门,允许某些数据不必遵守这一约束。这是与外键的初衷是相违背的。如果说:两张表之间的数据存在一种“部分”参照关系,也就是说的如果A表中有部分数据是需要参照B表中的数据,而有的则可以没有参照,那么,使用关联表对两张表之间的数据进行关联可能是更好的选择!这种关系的微妙之外在于,它即表明两表数据之间有“一定的”参照关系,但又不是必须的,它们也可以没有这种参照,显然,这表达的是一种更为宽松的关系,体现到对象间的关系上时,它可以表达一般意义上的关联关系,即A可以依赖于B(为至多个都可以),反之亦然。它不像外键约束,我们知道,外键约束最适用于描述的是父子关系:即:每一个孩子都必定有一个父亲(多对一,且非空),每一个父亲可能有0至多个孩子(一对多,可空。注:考虑到没有孩子的人不可以称之为父亲,因此说用父子关系形容这一类对象间关系也有一点点为妥)

      对于关联表来说,除去上面所讲到的情况,通过给关联表中的外键设定唯一约束,还可以表达出“部分的”一对一关系,也即optional one-to-one,典型的例子就是桌子员工分配关系!

     对于共享主键,可能描述的是最为严格的关系了:一对一,且双方均不得为空,并且同时存在,同时消亡,有同样的生命周期。像Thread和Subject Post之间的关系一样。

 

最后简单归纳如下:

对于共享主键方式:单向/双向一对一关系(关联双方均不可为空且有一致的生命周期)

外键方式:单向多对一(一端不能为空),单/双向一对一(通过对外键加唯一约束来模拟,同样外键所在一端不能为空)

关联表:双向一对一,一对多/多对一,(特别是单向一对多建议使用关联表),多对多

本文转载自:http://blog.csdn.net/bluishglc/article/details/6016677

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Hibernate映射——一对一单向关联映射(五)

映射原理 两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象模型,如下图所示: 对象...

architect刘源源
01/11
2
0
Hibernate利用关联关系操纵对象

Hibernate利用关联关系操纵对象 数据对象之间关联关系有一对一、一对多及多对多关联关系。在数据库操作中,数据对象之间的关联关系使用JDBC处理很困难。本节讲解如何在Hibernate中处理这些对...

猴亮屏
2014/10/07
0
0
总结:Hibernate关联关系映射——七种映射的实现(更新中)

一对一关联 Hibernate映射实体的一对一关联方式有共享主键方式和唯一外键方式。共享主键就是两个表的主键完全相同,保证一对一。唯一外键就是一个表的唯一外键对应另一个表的唯一主键,来保证...

xp731574722
2017/12/13
0
0
Hibernate Hibernate关联映射

Hibernate映射关系概述: Hibernate关联映射分为: ①、多对一。②、一对多。③、一对一。④、多对多。⑤、组件映射。⑥、集合映射。 在Uml语言中关联是有方向的,以客户Customer和订单Order...

Winnie007
2015/08/06
0
0
Hibernate映射——一对一双向关联映射(六)

我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。如图所示: 关键原因在于对象模型具有方向性: 单向:一...

architect刘源源
01/11
3
0

没有更多内容

加载失败,请刷新页面

加载更多

腾讯三大运维开源项目齐聚“OSCAR开源先锋日”

10月20日,腾讯开源三大运维开源项目——TARS、蓝鲸和织云Metis首次集结,参与了由中国信息通信研究院主办、云计算标准与开源推进委员会承办的 “OSCAR开源先锋日”。会上,腾讯开源团队与前...

腾讯开源
13分钟前
0
0
JAVA并发-从缓存一致性说volatile 讲的很好

学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间。在进行运算的时候,CPU将需要的数据映射一份在缓存中,...

码代码的小司机
31分钟前
0
0
IDEA 调试功能

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序...

狼王黄师傅
39分钟前
0
0
Java面试170题

1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? 4、float f=3.4;是否正确? 5、short s1 = 1; s1 = ...

lanyu96
44分钟前
0
0
优雅的写出类

前言 虽然现在已经是ES6的时代,但是,还是有必要了解下ES5是怎么写一个类的。 本文详述JavaScript面向对象编程中的类写法,并分步骤讲述如何写出优雅的类。 一、例子 例子为一个轻提示组件T...

peakedness丶
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部