您的位置:首页 > 其它

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

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

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

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



最后简单归纳如下:

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

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

关联表:双向一对一,一对多/多对一,(特别是单向一对多建议使用关联表),多对多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: