免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2368 | 回复: 0
打印 上一主题 下一主题

数据库设计 之外键 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-31 12:01 |只看该作者 |倒序浏览

                1.数据量的大小的确是个原因,一个数据量很大系统,太多的数据校验会导致性能低下。   
   我考虑过这样的方法,不知如何:基础数据之间使用外键,基础数据和业务数据之间不使用。   
   规范性和灵活性本身就是一对矛盾体,实际使用中却感觉很迷茫。
2.主键应该是单列的,以便提高连接和筛选操作的效率。
3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
外键增强为数据库开发人员提供了多项益处:
?        假定关联设计恰当,外键约束使得程序员更难将不一致性引入数据库。
?        数据库服务器具有集中式约束检查功能,因而没有必要在应用程序一侧执行这类检查。这样,就消除了不同应用程序使用不同方式检查约束的可能性。
?        使用级联更新和删除,简化了应用程序代码。
?        设计恰当的外键有助于以文档方式记录表间的关系。
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
FOREIGN
KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers
表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles
表中该出版商的书籍因为与 publishers 表中的数据没有链接而变得孤立了。FOREIGN KEY
约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的
行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY
约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
外键是用来控制
数据库
中数据的数据完整性的
就是当你对一个表的数据进行操作
和他有关联的一个或更多表的数据能够同时发生改变
这就是外键的作用
[精] 谈谈外键
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
FOREIGN
KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers
表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles
表中该出版商的书籍因为与 publishers 表中的数据没有链接而变得孤立了。FOREIGN KEY
约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的
行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY
约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。
外键是用来控制数据库中数据的数据完整性的
就是当你对一个表的数据进行操作
和他有关联的一个或更多表的数据能够同时发生改变
这就是外键的作用

       主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的
设计
对物理数据库的性能和可用性都有着决定性的影响。必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:
关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。
基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 主键应该是单列的,以便提高连接和筛选操作的效率。
注:
使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了
方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表
成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部
分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4.. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、
管理
记录行的关键手段就会落入不了解数据库设计的人的手中。
ITPUB个人空间
nd[,eI#I{%Cv
       外键是数据库一级的一个完整性约束,就是数据库基础理论书中所说的“参照完整性”的数据库实现方式。
*ux;?5HNStk0ITPUB个人空间'^        Jw
O#RKD/p_U|
       外键属性当然是可以去掉的,如果你不想再用这种约束,对
编程
当然不会有什么影响,但相应的录入数据的时候就不对录入的数据进行“参照完整性”检查了。  
    例如有两个表  
  A(a,b)   :a为主键,b为外键(来自于B.b)  
  B(b,c,d)   :b为主键   
  如果我把字段b的外键属性去掉,对编程没什么影响。
  如上面,A中的b要么为空,要么是在B的b中存在的值,有外键的时候,数据库会自动帮你检查A的b是否在B的b中存在。
  1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。  
  2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个
企业
现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。  

3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS
做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。  
  4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是
测试
系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。
最后说一下,建键几个原则:
1、 为关联字段创建外键。
2、 所有的键都必须唯一。
3、避免使用复合键。
4、外键总是关联唯一的键字段。
比如说BOOK表中的有一个字段是跟出版商有关联
我删除掉一个出版商的时候BOOK表也会删除掉!
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/84280/showart_2014169.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP