【MySQL数据库】外键和数据完整性

主、外键定义

  • 主键:保证数据的唯一性。
  • 外键:和第二范式有关,保证数据的一致性。传递依赖:A→B→C,则对于同一个B可能存在不同的C,此时将B作为外键,重新设计数据库。外键是空值或等于R1关系中某个主键值。

关系的完整性约束

  • 实体完整性:主关键字非空,如主关键字是多个属性的组合,则所有主属性均不得取空值。
  • 参照完整性:定义主键和外键引用的约束条件,即外键引用的主键必须存在,说白点就是参照的东西必须存在。举个例子,员工表employee有个部门编号deptNo,如果财务部门都不存在,财务部门所关联的员工也没有存在的意义,财务部的员工在员工表中就是脏数据。
  • 用户自定义完整性:实体完整性和参照完整性适用于任何关系型数据库系统,它主要是针对关系的主关键字和外部关键字取值必须有效而做出的约束。用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。

三范式

  • 第一范式:属性不可再分,即表中不能有表。
  • 第二范式:完全依赖。每一个非主属性完全依赖于表的主键,不能与主键的部分属性相关,主键与非主键遵循完全依赖关系。例如表order(cId,oId,oname,deptId,deptname)主键是由公司编号cId和订单编号oId组成,oname和deptId完全依赖于组合主键cId和oId,而不是部分依赖组合主键中的部分属性,而deptname依赖于deptId,也就通过传递完全依赖于组合主键。
  • 第三范式:没有传递依赖。在满足第二范式前提下,每一列都与主键直接相关,而不能间接相关(没有传递依赖)。上面的例子中deptname依赖于deptId传递依赖于组合主键,所以不满足第三范式。需要将部门信息单独拿出来作为一个表dept,然后把部门主键deptId作为订单order的外键。

ER图转表关系

  • 1对1:两个表任意选取其中一个作为主表,另一个作为从表,然后将主表的主键作为从表的外键。主表选取考虑的因素:尽量选取用户先查询的表作为主表,然后带出从表。如果,两个表存在父子关系,那么就要选取父表作为主表。
  • 1对N:选择1作为主表,N作为从表,并把主表的主键作为从表的外键。
  • N对N:需要一张新关系表包含两个实体的主键,关系表中的外键列不能为NULL。

数据完整性的实现方式

(1)程序自己实现,通过在逻辑层添加相应的代码,从而达到数据的一致性。
(2)外键。

外键的优缺点

优点:

1.可以保证数据的一致性,完整性,更可靠。

2.程序很难100%保证数据的完整性。外键在一定程度上可以说明业务逻辑。

3.外键可以增加ER图的可读性。

缺点:

1.性能:由于外键的存在,每次增加、删除、修改都会去检查是否违反数据的完整性,如果批量操作大量的数据,会严重影响性能。
2.老数据:由于很多系统都要求存储已存在的老数据,而这些老数据或多或少存在数据的不完整和不一致,为了保存这些老数据,必须放弃外键。
3.数据导入:通过EXCEL等软件直接导入数据非常方便,但导入数据和已保存在数据库中的数据关联存在一些问题。
4.跨数据库:一些数据库跨越更多的物理数据库甚至引擎,并且在技术上可能不能创建跨越数据库的它不能在同一台服务器上的两个数据库上创建key。

参考文章:

https://www.cnblogs.com/DBFocus/archive/2011/07/25/2116609.html  ER图转表关系

https://blog.csdn.net/zl1zl2zl3/article/details/88623144 外键的优缺点 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值