两个表主键相同,这两个表的主键是否互为对方的外键?
1个回答
2022-12-11 · 百度认证:北京惠企网络技术有限公司官方账号
关注
展开全部
不可以!\x0d\x0a \x0d\x0a如果两个主键名称相同说明不了什么的,我们还有一个词叫值域相同,也就是说两者必须是相同的类似与长度。也就是说外建表中的外键值域必须与主键表的主键值域相同。这才是外键约束的最关键部分。\x0d\x0a \x0d\x0a如果两者来源于同一值域,那么有可能两者可能组合成为同一张表。也就是说AB两表合并,使用同一个foo那么并没有改变函数的依赖关系。所以两表合一,在关系中还是可以合关的。所以可以考虑两表合并。\x0d\x0a \x0d\x0a但在关系设计后的并不十分完美,即便是我们不违反任何关系范式。因为在表设计中还有一类称为稀疏表与值域依赖关系。而你的问题合并后可能遭遇稀疏表的问题,其实稀疏表也也是一种值域依赖。它会导致大量的冗余数据的。\x0d\x0a \x0d\x0a比如,比如在某些系统中,所有一会员均可登陆,但只有部分会员在拥有该系统的银行账号(银行系统独立开发)。那么,银行系统中规则所有会员最多只能有一个账号,并且账号名称与登陆名称值域相同。那么两表实际上是1:1的关系,有些书上说所有1:1的关系可转人为一张表。那么,我们就会遇到很多账户的用户——造成大量空间的浪费!这就是为什么很多1:1表不能合并的原因,事实上如果合并后,两者可以设计成相同的值域的,虽然合并后两者还是同样没有改变任何函数依赖,但事实上这种空间的极大浪费却是无可避免的,那么不合并的情况下,银行系统中的账户主键同是为登陆用户的主键的外键时,两者构造了1:1关系。但不会导致大量的冗余数据的存在。不少书上虽不赞成1:1关系转化为一张表,但却没有说出任何原因——另外一些纯粹是误导,所有1;1关系增可转换为一张表。\x0d\x0a \x0d\x0a当然有时我们为了提高数据库运算效率,而对表进行了垂直拆分(也就是说,一个表将主键和部分属性,而另一个表为主键和另一部分属性)。这种方式常见于表中部分数据最常用,而另一部分不常用,那么,我们将属性按常用与不常用拆成两个表。这种情况下,一般用于两者独立性很强的场所,不要有很多地方对其再连接还原,因为链接是很耗时的操作。这种设计规则还是可以存在的。但这时往往会给一些“善于”思考的读者留一个疑问!这拆分的两个表能不能主键互相做另一个表的外键呢?\x0d\x0a \x0d\x0a我不知道这些“善于”思考者的心理是怎么想的——但是我知道这是完全无必要的。因为你既然想建立如此关系,就是相同步删除或插入而已,防止出现只删除了一个表中的数据而另一个表会留下无意义的数据——事实上这种情况是存在的!氢如果两者主键又同时互为外键时,就可做到同步——嗯,相法不错!\x0d\x0a \x0d\x0a但是如果你这种同步对于你来说非常重要——那么当初你不应该拆表!或者说你当初应该选择水平拆表的办法(多表结构相同,存储不同的记录),否则干嘛费那事?但如果你想两者兼顾——我只能告诉你,你太“善于”思考了——以致于象这种天方夜谈都想出来了!\x0d\x0a \x0d\x0a事实上是不可以了!从原理上来看,如果数据允许你这么设计,那么,你在删除时你准备删除那条数据?A表中的?还是B表中的,如果你删除A表中的,那么,它做为一个主键,那么你必须要先删除B表中的外键,在为数据库在检查时必须先删除外键数据记录,然后才会删除主键。要不数据库会出现一个不知在何处存在的外键了!是的,数据库会替您先删除B表中的主键的。这与你A表删除多么相似啊?要想删除B表,那么B的外键所指示的A表主键同样得先删除吧——这个循环怪圈你永远跳不出去!所以无法级联删除!\x0d\x0a \x0d\x0a显然同样的问题会出现在插入上,你准备在A表中插入一条记录,因为A表中的主键也是外键,想插入?那么麻烦您先插入B表中的一条数据吧,B表想插入?那么它和A表插入的情况又有何不同呢?所以你根本无法插入一条数据!\x0d\x0a \x0d\x0a太开玩笑了——如果我不设置删除时检查和插入时检查不就可以了?事实上更新检查又何尝试不是呢——如果更新检查也不设置呢?\x0d\x0a \x0d\x0a那么——我就想不起来你建这个外键约束还有何必要了!建一个约束,然后这个约束力不让生效,这是做何道理呢?\x0d\x0a \x0d\x0a所以,主键互为外键——从理论上来讲,你认为有任何的必要性么?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询