`
letitbe
  • 浏览: 239655 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

是否应该建外键的讨论

阅读更多
http://www.iteye.com/topic/124612
http://www.iteye.com/topic/2832
http://www.iteye.com/topic/8283
http://www.iteye.com/topic/151187
http://www.iteye.com/topic/2312

http://www.itpub.net/viewthread.php?tid=510215&extra=&page=1

以下摘几个我自己认同的观点:
1,
其实有一段时间我们的开发人员也有这种想法,以为程序可以控制好
后来发现没有外键的表里经常有垃圾数据(找不到父亲的孩子),然后又把外键一一加上去,后面测试才发现是应用的BUG,在特定情况下才会发生的BUG。
如果没有外键那数据库就不会报错,也就是说垃圾数据不能阻止。
2,在复杂的业务逻辑下,程序来保证这个是极不可靠的,只有交给数据库从底层来保证才能避免出错。
当然,如果是稳定的程序中把外键去掉会怎么样,这又是另一回事了。
外键的存在对数据库的维护来说是有一些不方便的地方。
3,我们以前做开发的时候,在开发、测试阶段,是所有业务逻辑需要的外键都加上的。数据量小,并发少,也无所谓什么性能什么的。等测试和试运行一段时间后,再将外键去掉,以提高性能。
4,怎么这么多人不用外键的,外键可是逻辑的约束啊!说外键影响性能,可以denormalize外键表啊,但是插入更新必须要符合约束啊,我觉得这是不可替代的啊
对数据的约束最好尽可能放到db里,集中管理清晰准确,以前吃过应用管理约束的亏,不过好好看看oracle sap这些范式做的都还不错啊,他们都这样做我想多少能说明点问题吧
5,你看看oracle系统数据表的设计,再看看大型数据库表的设计,
你就明白,外键约束无处不在.
6,该用的地方,就一定要用!前几天我们的应用程序发现一个bug,后来我仔细一查,就是由于没有使用外建,数据不匹配导致的。教训深刻!
7,如果现在要我来选择,我决定是要用的一定要用,这是系统设计的严谨性的要求,不然产生一堆垃圾数据,这是在一个好的系统中是不允许的。
8,呵呵,做过开发的DBA应该都会有这样的体会
当统计报表中的数据不对的时候就知道什么叫问题严重了,要一点点数据去核查。
9,最好还是使用数据库外键这个最直观的功能吧
至于性能不知有没有什么测试数据,究竟能慢到什么程度,不要听说会慢就不用吧(呵呵,从TOM的书里学到的)
10,这要看是建立那中类型的数据库了
如果是操作类型的数据库 OLTP 面向应用的
数据的规范化是很有必要的.. 该用外键的情况一定要用.
如果是面向部门 用于OLAP或建立数据仓库.
这种时候 往往需要反规范化 存取效率是首要因素

我自己的结论:如果是做企业级的OLTP应用,并且数据量不是非常大的话,一定要建外键。毕竟对于企业来说,保证数据的正确性是最重要的。但如果经过长时间的运行证明代码可靠、并且数据量已经很大,这时也可以去掉外键以提高运行速度。
评论
1 楼 kilobug 2009-04-22  
受教了!!!

相关推荐

    MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

    首先,我们来讨论外键(Foreign Key)。外键是一种约束,用于维护两个表之间的引用完整性。在MySQL中,一个表的外键字段指向另一个表的主键,确保数据的一致性和关联性。例如,如果有一个学生表和课程表,学生表中的...

    删除并重新创建SQL Server中所有外键SQL脚本

    下面将详细讨论如何通过T-SQL语句来实现这个过程。 首先,我们要理解什么是外键(Foreign Key)。外键是表中的一个字段,它引用了另一个表的主键,从而建立了两个表之间的关联。外键约束确保了参照完整性,即不允许...

    画数据库ER图的工具

    在ER图中,可以标注键、主键、外键以及各种关系的类型,如一对一、一对多、多对多等。 3. **ER图绘制工具的功能**: - **图形化界面**:提供直观易用的拖放功能,方便用户创建和编辑实体、属性和关系。 - **自动...

    论坛T-SQL语句实例 简单易懂 建库建表建约束等

    本资源针对初学者,通过"论坛T-SQL语句实例 简单易懂 建库建表建约束等"这个主题,旨在帮助初学者快速理解和掌握T-SQL的基础操作。 首先,我们来讨论如何创建数据库。在T-SQL中,使用`CREATE DATABASE`语句可以新建...

    大型关系数据库期末参考试题.docx

    适合建索引的列通常具有较高的查询频率,且不应该包含大量重复值,是外键或主键的列一般会自动建立索引。 第八章提到了存储过程,它是预编译的SQL语句集合,可以提高性能并减少网络流量。存储过程可以带参数,可以...

    PowerDesinger15建PDM最实用的图文教程

    - 双击表格,在弹出的对话框中添加数据库字段,并为每个字段设置必要的属性,如主键、标识列、是否允许为空等。 - 同时还需要配置表之间的外键关系。 - **配置数据源**:为了能够生成实际的数据库,还需要配置相应...

    mysql5.1 中文参考手册

    - 表管理:创建、修改和删除表,以及设置主键和外键约束。 4. **数据操作**: - 插入数据:使用 INSERT INTO 语句将数据插入表中。 - 查询数据:通过 SELECT 语句执行复杂查询,包括子查询和联接操作。 - 更新...

    生成表格_excel_

    标题"生成表格_excel_"暗示了我们讨论的主题是利用C#来生成Excel表格,可能涉及到读取、编辑和导出Excel数据。C#提供了多种库,如EPPlus、NPOI等,可以方便地操作Excel文件,创建工作表、填充数据、设置格式以及执行...

    比较SQLSERVER数据库差异

    比较触发器差异意味着要检查每个数据库中的触发器是否存在、定义是否相同,以及触发的事件和执行逻辑是否一致。 存储过程是预编译的SQL语句集合,可以包含复杂的业务逻辑。在对比过程中,我们需要关注存储过程的...

    access+asp 个人博客系统

    在博客系统中,"bbs"可能是指论坛或讨论区的部分,用户可以在其中进行话题讨论和交流。 基于这些信息,我们可以推断出这个"access+asp 个人博客系统"可能包含以下知识点: 1. **ASP编程基础**:包括ASP的脚本语法...

    MySQL-数据库经典面试题解析.docx

    - **外键**:InnoDB支持外键约束,MyISAM不支持。 - **MVCC**:InnoDB采用MVCC提供并发控制,MyISAM无此功能。 - **COUNT(*)性能**:MyISAM有预存行数,更快;InnoDB需全表扫描。 - **索引**:InnoDB支持行级...

    关于SQL Server 2005中XML数据存储的研究.pdf

    同时,文章也讨论了使用XML数据类型进行数据建模的模式,例如在同一个表中创建关系列和XML类型列,或者在有外键关系的独立表中创建XML类型列。 在实际应用中,存储XML数据时需根据数据的特性选择合适的方法。例如,...

    ACCP6.0 S2 SQL资料

    课程会讨论数据库完整性的重要性,以及如何通过约束(如主键、外键)来维护数据完整性。 4. **SQL语言**:SQL(Structured Query Language)是用于管理和操作数据库的标准语言。学员将学习如何使用SQL进行基本的...

    Oracle XML开发手册.rar

    5. **XPath和XQuery支持**:Oracle数据库内建对XPath和XQuery的支持,使得在SQL查询中提取和操作XML数据成为可能。XPath是定位XML元素和属性的路径语言,而XQuery则是一种更强大的查询语言,可以检索、组合和处理XML...

    mysql学习文档

    - 表的创建与操作:`CREATE TABLE`语法的详细解析,包括字段类型、约束条件(主键、外键等)的设置。 - 数据导入导出:使用`LOAD DATA INFILE`和`SELECT ... INTO OUTFILE`进行数据批量导入和导出,以及使用`...

    数据库第六章数据库设计习题.pdf

    本章主要讨论了数据库设计的多个方面,包括需求分析、逻辑结构设计、物理结构设计等关键阶段。 1. 数据流图是数据库设计中需求分析阶段的工具,用于描绘数据的流动和处理过程。 2. 将E-R图转换成关系数据模型是逻辑...

    django开发中文版资料

    - **模型语法**:详解模型字段的定义规则,例如主键、外键等。 - **字段类型**:列举所有可用的字段类型及其特点。 - **元选项**:解释`Meta`类的作用及常见的元选项。 - **模型类**:进一步探讨模型类的设计原则与...

Global site tag (gtag.js) - Google Analytics