今天听了一个企业技术总监的宣讲,结果听说在他开发系统的过程中,都没有用到外键,这让我很惊讶,赶紧上网搜索了一些资料看了看,终于明白了不用外键的原因。
这是一篇关于是否使用外键的讨论,讲的很有道理 :
对于主 / 外键 / 索引来说,在一些开发团队中被认为是处理数据库关系的利器,也被某些开发团队认为是处理某些具体业务的魔鬼,您的观点呢?在实际应用中您会采取哪种方式?
大家共同观点:
主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作
,
矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。
正方观点:
1
,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难
100
%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg
:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了
C
应用呢?
2
,有主外键的数据库设计可以增加
ER
图的可读性,这点在数据库设计时非常重要。
3
,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。
反方观点:
1
,可以用触发器或应用程序保证数据的完整性
2
,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3
,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在
insert, update, delete
数据的时候更快)
eg:
在海量的数据库中想都不要去想外键,试想,一个程序每天要
insert
数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在
3
个小时做完,如果加上外键,需要
28
个小时!
结论:
1
,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2
,用外键要适当,不能过分追求
3
,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。
文章出处: http://www.diybl.com/course/7_databases/database_other/200838/103356.html
上面提到了触发器的概念,我这里用 MYSQL 举例
触发器的概念: “ 在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。 ”(Wikipedia) 说得简单一些,它是在一个特殊的数据库事件,如 INSERT 或 DELETE 发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的 “ 层叠式 ” 更改、或保证对表格关系进行自动更新。当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是一个触发器。自动记录对一个特殊数据库表格所作更改的 SQL 命令块也是一个触发器实例。
触发器是
MySQL 5.x
的新功能,随着
5.x
代码树新版本的出现,这一功能也逐渐得到改善。在本文中,我将简单介绍如何定义并使用触发器,查看触发器状态,并如何在使用完毕后删除触发器。我还将为你展示一个触发器在现实世界中的应用实例,并检验它对数据库记录的改变。
再讲述一下索引的概念
一、索引的概念
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
二、索引的特点
1. 索引可以加快数据库的检索速度
2. 索引降低了数据库插入、修改、删除等维护任务的速度
3. 索引创建在表上,不能创建在视图上
4. 索引既可以直接创建,也可以间接创建
5. 可以在优化隐藏中,使用索引
6. 使用查询处理器执行 SQL 语句,在一个表上,一次只能使用一个索引
7. 其他
三、索引的优点
1. 创建唯一性索引,保证数据库表中每一行数据的唯一性
2. 大大加快数据的检索速度,这也是创建索引的最主要的原因
3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5. 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
四、索引的缺点
1. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
要善于使用存储过程,它使 sql 变得更加灵活和高效
最后是视图,再面向接口编程的思想和尽可能重用的思想,我们需要借助视图,这在李老师语录中我就写到,所以了解视图时很必要的 .
http://book.51cto.com/art/200710/57708.htm
存储过程 : http://book.51cto.com/art/200710/57711.htm
类似于 JDBC 的预处理语句,可以填充参数决定执行的结果。一向技术提出,总有解决某方便的问题才会被使用,所以为什么要用存储过程?
由于存储过程对于 MySQL 来说是新的功能,很自然的在使用时你需要更加注意。
毕竟,在此之前没有任何人使用过,也没有很多大量的有经验的用户来带你走他们走过的路。然而你应该开始考虑把现有程序(可能在服务器应用程序中,用户自定义函数(
UDF
)中,或是脚本中)转移到存储过程中来。这样做不需要原因,你不得不去做。
因为存储过程是已经被认证的技术!虽然在
Mysql
中它是新的,但是相同功能的函数在其他
DBMS
中早已存在,而它们的语法往是相同的。因此你可以从其他人那里获得这些概念,也有很多你可以咨询或者雇用的经验用户,还有许多第三方的文档可供你阅读。
存储过程会使系统运行更快!虽然我们暂时不能在
Mysql
上证明这个优势,用户得到的体验也不一样。我们可以说的就是
Mysql
服务器在缓存机制上做了改进,就像
Preparedstatements
(预处理语句)所做的那样。由于没有编译器,因此
SQL
存储过程不会像外部语言(如
C
)编写的程序运行起来那么快。但是提升速度的主要方法却在于能否降低网络信息流量。如果你需要处理的是需要检查、循环、多语句但没有用户交互的重复性任务,你就可以使用保存在服务器上的存储过程来完成。这样在执行任务的每一步时服务器和客户端之间就没那么多的信息来往了。
所以存储过程是可复用的组件!想象一下如果你改变了主机的语言,这对存储过程不会产生影响,因为它是数据库逻辑而不是应用程序。存储过程是可以移植的!当你用 SQL 编写存储过程时,你就知道它可以运行在 Mysql 支持的任何平台上,不需要你额外添加运行环境包,也不需要为程序在操作系统中执行设置许可,或者为你的不同型号的电脑存储过程将被保存!如果你编写好了一个程序,例如显示银行事物处理中的支票撤消,那想要了解支票的人就可以找到你的程序。
转自: http://blog.csdn.net/neusoft_lkz/archive/2009/07/21/4366668.aspx