数据库物理外键与逻辑外键

外键

数据库中的表必须符合规范,才能杜绝数据冗余、插入异常、删除异常等现象。规范的过程是分解表的过程。经过分解,同一事物的代表属性出现在不同的表中。显然,它们应该保持一致。外键的值或者是另外一个表的主键值或者为空值*。例如:学号在学生表里是主键,在成绩表里是外键。成绩表里的学号一定要是学生表里的学号。于是,学生表里的学号和成绩表里的学号就一致了*。可以直观地理解,外键的功能是实现同一事物在不同表中的标志一致性。功能的实现由外键联系的两个表,在单独操作时,外键功能由两种方法实现

物理外键

指的是使用foreign key 作为外键关联另一张的字段的连接方法,而且限定了引擎为InnoDB,而逻辑外键,又叫做事实外键,是因为存在语法上的逻辑关联而产生的外键,需要有连接关键词inner join 或者left join 等等和连接部分,也就是on后面的部分,如果需要对应的设置,也可以加上set等语句。

另外,物理外键也相应的出现许多问题
1.数据库需要维护外键的内部管理;

2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;

3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,消耗资源;

4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况

因此,所有tables必须是InnoDB型,它们不能是临时表。在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度 InnoDB不对那些外键或包含NULL列的被引用键值检查外键约束。

外键的主从关系是定的,然后你会遵守这个规矩去干活。但是计划赶不上变化,万一哪天主键所在表需要拆分了呢?需要重构了呢?万一哪天你突然发现外键表不是非得跟主表的主键挂上关系呢?就我经历过的来看,这种情况并不少见,尤其是数据库设计者水平不够高的情况下。另一方面,数据库帮你保证级联关系,你平时写程序的时候就真的思路清晰吗?因为某些原因(比如你想要的关系数据库不支持,mysql经常),有些地方你就不能设计外键了,当有级联更新的需要时,一部分靠物理外键,一部分还得靠自己,我觉得还不如全靠代码逻辑去保证。

外键保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值

使用原则:
1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。

注:具体使用物理外键和逻辑外键需以具体情况而定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值