什么是外键,外键的作用
什么是外键:
如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)
外键的作用:
①为了一张表记录的数据不要太过冗余。
②保持数据的一致性、完整性。
是否有必要使用外键?
正方(需要)
1.数据一致性由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据 的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?2.ER图可靠性有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。3.使设计更全面外键在一定程度上说明的业务逻辑,会使设计周到具体全面4.级联性能未必最低除非能证明触发器的性能和可维护性比外键更优,否则凭什么一定要否定外键呢?5.程序能完全保证安全性吗?使用应用程序来维护数据完整性,则是严重降低数据库安全性的一种做法。连接字符串里如果有uid和pwd或者类似的这两个东西,可以使用工具获取你数据库的帐号。因为每次建立数据库联接的时候都会在网线上以标准格式传递这些信息。从此编码内的任何保证都是空的。6.导致冗余不使用外键,会导致数据冗余,在级联最底层的表可能会重复好几层的数据 必然导致最底层的表数据量翻倍,IO瓶颈是数据库性能瓶颈之一。
反方(不需要)
1.程序逻辑
某些程序逻辑中,程序的逻辑已经足够保证完整性,我会在存储过程或包等地方做严谨的判断;
2.性能问题
这是很多人不喜欢用的关键原因,比如一个业务流水表,频繁插入数据,如果这个表身上有3外键,那么每次插入一条,就必须对这3个外键对应的3个表做相应的查找判断有无对应数据,如果这3个表也很大,那就这3个表的判断时间就很常,虽然外键指向的关联表的字段肯定是索引,但是我觉得很多时候,这样的判断本来就在程序里控制好了,通过外键再判断一次,就是降低性能;而且其实有的地方判不判断也无所谓的,但是用了外键,就必须化时间去判断,无论oracle内部多么优化外键对于数据的检索速度,它总是一个不小的消耗;
3.维护麻烦
很多公司的软件都是定制的,这种定制的东西,随意性相对较大,项目开发实施过程中,需要经常对表修修补补;还有就是业务逻辑有bug或者其他情况,需要经常手工维护数据,有错综复杂的外键关联着,很是麻烦;
4.外键定死了先后生成关系外键定死了两个表之间数据的先后生成关系,最常见的是单据主从表,有的时候,在生成单据的时候,是先生成明细,再生成主表;如果钉死了外键,这个就没法实现;PS: 当然有些关键的业务,确实需要外键;
为什么不用外键?
数据库外键争论(http://www.cnblogs.com/chenkai/archive/2009/11/11/1601193.html?page=2#commentform)
下面的话全是上面争论里的原话,我就截取了三个人的,因为我个人也偏向不使用外键
1、淡化外键,并不能简单武断的说淡化或不淡化。 必须根据实际情况来决定,如数据来源,关联影响,业务控制逻辑等。
以下是个人关于是否淡化外键的个人经验和想法。
淡化外键的情况:如果对于某此数据来源复杂,且单表操作对系统基本没有什么影响的情况下,可以淡化外键。 何谓数据来源复杂?数据的来源不止仅限于自由系统,更可能来源于其它系统,或人工的数据导入,并且导入的数据不全面,在这种情况下,淡化外键可以极大减少工作量,并且极大的降低工作的复杂度。
不能淡化外键的情况:关键数据,业务逻辑很严谨,数据来源单一,数据来源规则标准固定的。业务逻辑严谨是指数据表之间的关联很好,变动一个表的数据,必须对另一个表产生影响,有时这种影响还相当的大。数据来源单一是指数据都从自身系统来,或固定的其它系统通过一定的逻辑录入;数据来源规则标准固定是指从其它地方人工录入或是对过库对库的数据录入或同步时,数据规则是一致的。 在这种情况下,根据约束完整性设置外键,一方面能保证系统的健壮性,另一方面可以及排除淡化外键的情况可能出现的一些数据问题(你懂的,很多时候是人工操作,或来源数据不全导致的一些问题)。
完美的系统一定不是最合适的系统,依据现实而言,只需要最合适的。
2、几乎不用,抛开性能不说,开发、测试、部署、实施,以及维护的时候都带来不少问题
数据完整性几乎都是业务的要求,理应由业务部分负责维护,而不是依赖数据库
访问量较大的web应用,以及有一定规模的企业应用,都关注伸缩性和性能问题,各种形式的垂直、水平切分运用越来越多,外键、触发器、存储过程之类的基本属禁区
3、我的建议是:
1.尽量不使用外键.
2.被关联的表一般不删除数据,只是把数据标示为"已删除".
什么是外键,外键的作用相关推荐
- mysql中主键外键的作用_数据库主键和外键的作用以及索引的作用,它的优缺点是什么?...
定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证 ...
- [数据库03]-约束(唯一性-主键-外键/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式
[数据库03]-约束(唯一性-主键-外键)/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式 一.约束 1.1 唯一性约束(unique) 1.2 主键约束 1.3 外键约束 二.存储引擎 2 ...
- MySql数据库主键外键与数据库设计
MySql数据库主键外键与数据库设计 首先要指出的: 列.字段.属性是一个概念 行.记录.元组是一个概念 MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束 show c ...
- mysql 主键外键sql_SQL外键VS主键说明了MySQL语法示例
mysql 主键外键sql A Foreign Key is a key used to link two tables. The table with the Foreign Key Constra ...
- mysql中表的约束,主键外键唯一键
mysql2 表的约束 空属性(NULL) 默认值 列描述 zerofill 主键 主键属性 复合主键 追加主键 删除主键 自增长 唯一键 外键 表的约束 空属性(NULL) 此时 name 的 Nu ...
- PowerDesigner中的CDM设计的外键作主键的问题
PowerDesigner中的CDM设计的外键作主键的问题 From:tonyepaper.cnblogs.com 2009-09-15 00:58 两个实体之间是一对一的关系.两个实体的标识符是&q ...
- oracle 通过数据库主键外键级联删除
通过PLSQLDEV设置 1,创建一个有主键的表 2,创建一个丛表,通过PL/SQDEV设置带有级联删除的外键 编辑外键表-->键-->填写键名称-->选择Foreign--> ...
- mysql 一 、关系模型——主键——外键——索引
关系模型 表的每一行称为记录(Record),记录是一个逻辑意义上的数据. 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段. 字段定义了数据类型(整型.浮点型.字符串.日 ...
- 数据库 主键 外键 唯一键区别
下面我通过一个小栗子来说明我们应该如何选择主键,外键和唯一键. 现在我们想建立学生表,用来存储,一个系统的登陆信息.建表如下: create table student4 ( stu_id in ...
- SQL-主键外键的定义
primary key 主键 需设置为不为空不重复&自增列 not null auto_increment primary key 一个表仅允许一个主键,但主键可由多列组成 create ta ...
最新文章
- 大多数比特币 混币交易属合法交易
- C#和Sql Server 2005中时间的最大值和最小值
- python request.get乱码_python的request中文乱码怎么办
- 三星note4 9100自动关机问题以及空间不够的问题研究。。。。
- 【三维路径规划】基于matlab蚁群算法无人机三维路径规划【含Matlab源码 1278期】
- Backup Exec启动时,系统报“CLR20r3“错误
- 【历史上的今天】6 月 25 日:笔记本之父诞生;Windows 98 发布;通用产品代码首次商用
- 视频转换器怎么将视频转成GIF动画
- java实现科学计算器
- window 服务器443端口占用,443和80端口被占用win10如何解决_443和80端口被占用win10怎么处理...
- 2019年系统架构师考试心得
- linux虚拟机对外部sd卡格式化和分区
- 工业物联网有什么特征
- 外汇平台哪个比较好 2017年排行总结 Flyerinternational稳居前五
- JAVA基础篇(1)
- halcon-检测圆弧拟合圆
- 为什么说CRM对B2B企业很重要?
- 伦敦网约车新规:须通过英语水平考试
- JavaScript-81.8-操作元素属性-JS在VS Code中添加图片
- 不错的电子书搜索引擎
热门文章
- 找到林子里的路 # D03
- 我遇见了我 | 虚拟数字人养成,FaceGood 虚拟数字人开源技术研讨会
- 霍夫变换阀值选取问题
- numpy.random.rand(),numpy.random.randn(),numpy.random.normal()函数介绍和示例
- opencv图像处理初步(一):灰度化和二值化
- 2019阿里系电子书合集来了,免费下载
- python微服务架构设计模式_微服务架构设计模式 PDF 电子书 百度云 网盘下载
- 电脑一键重装Windows7系统步骤解答
- Qorvo 扩展 750V SiC FET 范围
- 疑难杂症篇(十)--Catia软件出现“没有合适的许可证来实现xx的请求”解决方案