`
huangqibing0626
  • 浏览: 14633 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论
阅读更多
今天看到一个电子商务系统,用powerdesigner工具逆向了他的数据库,发现里面的数据库表没有一个设置了外键,这是我以前从未遇到过的,所以就不得不怀疑他数据库表设计的好坏和数据冗余度。但后来又想了一下其实在以前项目中设置外键也遇到了很多不便,再做查询时需关联很多表,这样势必导致性能的下降。鉴于这些疑问,专门google了一下,发现讨论的人大有人在:

主键和索引是不可少的,不仅可以优化数据检索速度,开发人员还省不其它的工作,

矛盾焦点:数据库设计是否需要外键。这里有两个问题:一个是如何保证数据库数据的完整性和一致性;二是第一条对性能的影响。

正方观点:
1,由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。
eg:数据库和应用是一对多的关系,A应用会维护他那部分数据的完整性,系统一变大时,增加了B应用,A和B两个应用也许是不同的开发团队来做的。他们如何协调保证数据的完整性,而且一年以后如果又增加了C应用呢?
2,有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。
3,外键在一定程度上说明的业务逻辑,会使设计周到具体全面。

反方观点:
1,可以用触发器或应用程序保证数据的完整性
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert,   update,   delete   数据的时候更快)
eg:在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不 止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时! 

结论:
1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2,用外键要适当,不能过分追求
3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。


1. 在大规模插入,海量数据的情况下,外键的确是影响性能的,这个毋容置疑,毕竟是判断完主键再判断外键。
2.但是主要是第二点。这个也就是我一直在想,面向对象开发和关系型数据库配合时不可调和的矛盾问题。
试想,先有类,后有数据表,你会在一个类里写
class People
{
private int cityid;
}
还是
class People
{
private City city;
}
很明显是第二个,那么剩下的就各有争议了,到底是把City换成cityid和cityname,还是只是一个cityid。
-----
总之,我认为一切的讨论,说句废话,用外键还是不用外键是一个要自己去协调的问题。
1. 团队习惯 2. 性能要求
而最关键的,如果想完全把这个争议避免,那就等待关系型数据库的灭亡吧


1,可以用触发器或应用程序保证数据的完整性
答:除非能证明触发器的性能和可维护性比外键更优,否则凭什么一定要否定外键呢?使用应用程序来维护数据完整性,则是严重降低数据库安全性的一种做法。
2,过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题
答:大项目的开发难度自然大,一个项目有100个表似乎很正常的。记得一个很流行的论坛,动网先锋。看看人家Access版的里面有几张表吧,记得是有30个以上的。
同时,不使用外键并不会导致表少多少,反而会在大数据量的时候硬盘文件太大导致性能下降
3,不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)
答:数据导入导出的性能和外键、索引一点没有关系。不相信的可以去学习有关数据库操作。
而所谓的数据修改时候的快,其实仅仅快一点点,而这一点点快带来的后遗症就是数据冗余。考虑一下今后对这些字段的更新操作会有多麻烦吧。
比如,把用户表里的用户姓名以文字方式存放到了所有的相关表,可能有10多个吧。一旦有更改用户姓名的操作,将是一个怎样的操作阿?
eg: 在海量的数据库中想都不要去想外键,试想,一个程序每天要insert数百万条记录,当存在外键约束的时候,每次要去扫描此记录是否合格,一般还不止一个字段有外键,这样扫描的数量是成级数的增长!我的一个程序入库在3个小时做完,如果加上外键,需要28个小时!
答:首先,你这个入库的数据是否本身都是正确的?如果是,则可以用数据库的有关操作让28小时立即变成3小时。反之,你在3小时里面如何完成所有的数据完整性验证?
分享到:
评论

相关推荐

    关于Oracle中表外键更名规则详细介绍

    Oracle中表的外键是保证系统参照完整性的手段,在实际应用系统中,开发者为了保证系统的完整性,一般要定义大量的外键。如果外键的命名不规范,如...文中讨论如何将应用系统中不规范的外键命名修改为规范的外键名称。

    oracle建表练习(主键外键)

    在本次Oracle建表练习中,我们将会重点讨论建表时使用的主键(Primary Key)和外键(Foreign Key)概念。 首先,我们来详细了解一下主键的概念。主键是数据库表中每一行记录的唯一标识,它保证了表中的每条记录都能...

    Hibernate一对一单向外键关联 (联合主键annotation)

    这里我们讨论的是单向外键关联,即一方实体持有了另一方的外键。 在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。这个注解可以放在属性上,表示该属性对应另一个实体的实例。外键通常设置在关系的“从属...

    在标准的三层架构中用GridViwe显示数据库外键的数据

    接下来,我们讨论如何在GridView中显示外键数据。外键是数据库设计中的一个重要概念,用于维护表之间的关系,通常用于实现一对多或多对多的关系。在ASP.NET中,我们可以通过以下步骤实现: 1. **创建数据模型**:...

    Hibernate一对一唯一外键关联映射(单向关联)

    在本例中,我们讨论的是后者,即通过一个独立的外键字段在两个表之间建立一对一的关系。 ### 2. 唯一外键关联映射 #### 2.1 定义实体类 首先,我们需要创建两个实体类,分别代表两个相关的表。例如,我们有`...

    MySQL SQL高级特性 字段约束-索引-视图-外键学习实践

    在本部分中,虽然没有详细讨论外键的使用方法和作用,但可以知道外键在数据库设计中用于实现数据表之间的关联。 总结来说,字段约束、索引、视图和外键是MySQL数据库设计和优化的重要组成部分。通过理解和合理使用...

    MLDN魔乐科技JAVA培训_Oracle课堂18_外键约束.rar

    接下来,我们讨论如何在Oracle数据库中创建外键约束。在SQL语句中,可以使用ALTER TABLE命令来添加外键约束。基本语法如下: ```sql ALTER TABLE child_table ADD CONSTRAINT fk_constraint_name FOREIGN KEY ...

    数据库外键,用还是不用?

    近在做一个派单系统数据库设计,在设计中有些疑惑的地方中午在网上发起一个话题讨论。我把这个讨论流程发过来,大家可以可以看看。  也可以发表一下自己的意见。  对于主/外键/索引来说,在一些开发团队中被...

    Hibernate ORM - 一对一外键关联关系

    作者"Dreamzhong"可能讨论了如何通过配置XML映射文件或使用注解来建立这种关系,以及在实际应用中的最佳实践和注意事项。 **标签详解:** 1. **源码**:这表明文章可能涉及到了具体的代码示例,可能包括XML映射...

    Hibernate基于外键的一对多单向关联

    “工具”标签则暗示了讨论的是一个开发工具,即Hibernate,它是Java世界中用于数据库操作的重要框架。 **文件名解析:** "product.sql" 这个文件可能是数据库脚本,包含了创建商品表的SQL语句,可能包括外键约束,...

    hibernate中的 一对一唯一外键双向关联

    我们在这里主要讨论这种关联方式。 **二、配置唯一外键** 在XML映射文件中,我们需要为每个实体定义`<one-to-one>`标签来表示一对一的关联。例如,如果我们有两个实体,`User`和`Profile`,`User`有一个`Profile`...

    Hibernate教程05_关系映射之一对一双向外键关联

    本教程重点讨论的是外键关联,这意味着一方的表将包含指向另一方表的外键。双向关联意味着两个实体类都可以直接访问彼此。 接下来,我们将详细解析标签“Hibernate”和“一对一双向”。在Hibernate中,一对一关联的...

    Hibernate 一对一关联映射(主键关联VS唯一外键关联)

    接着,我们讨论唯一外键关联。在这种情况下,一个实体拥有一条指向另一个实体的外键,但它们并不共享主键。这适用于一对一关系不那么紧密的情况,比如订单与订单详情。在Hibernate中,使用`@OneToOne`注解和`@...

    Hibernate一对一单向外键关联(annotation/xml)

    在这个场景中,我们讨论的是单向关联,即只有一个实体知道这个关联关系。 **注解方式实现一对一单向外键关联** 1. **定义实体类**:首先,我们需要创建两个实体类,例如`Person`和`IdentityCard`。在`Person`类中...

    oracle中如何创建约束?

    本文将重点讨论在Oracle数据库中如何创建外键约束,同时也会提及其他类型的约束。 ### 外键约束 外键约束用于维护两个表之间的关系,确保引用完整性。在创建外键约束时,需要指定一个表中的列作为外键,它必须与另...

    经典SQL语句大全_主外键_约束

    在进行更深入的讨论之前,我们需要了解一些基本概念: 1. **约束(Constraint)**:约束是一种用于确保数据完整性的机制。它定义了可以在表或表的单个列中输入的数据限制条件。 2. **主键(Primary Key)**:用于...

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

    下面我们将详细讨论这个过程,以及如何通过T-SQL脚本来实现。 首先,理解T-SQL(Transact-SQL)是SQL Server的扩展,它提供了更多的功能和语法,包括创建、修改和删除数据库对象,如表、索引和外键。在SQL Server中...

    hibernate一对一之唯一外键关联(单向关联)

    在这个场景下,我们将讨论一种特殊的一对一关联方式——唯一外键关联(Single ForeignKey Association),且为单向关联。这种关联方式意味着在一个实体中有一个字段作为另一个实体的主键引用。 首先,我们需要理解...

    数据表的关联关系图-父表与子表的关联关系

    本话题主要讨论的是“数据表的关联关系图”,特别是父表与子表的关联关系,涉及到的核心概念包括主键、外键、父表和子表,以及多对一关联。 首先,我们来理解什么是主键和外键。主键(Primary Key)是表中的一个或...

Global site tag (gtag.js) - Google Analytics