数据库中主键和外键的设计原则
來源:http://www.cnblogs.com/deng02/archive/2009/02/26/1398462.html
主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的 影响。
必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就 很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。
主键:
关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:
1. 惟一地标识一行。
2. 作为一个可以被外键有效引用的对象。 http://www.mscto.com
基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:
1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
2. 主键应该是单列的,以便提高连接和筛选操作的效率。
软件开发网
注: 使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际 意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反 对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能 再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。
3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户 无意义的原则被违反了。
注: 这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。
4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动 机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。
数据库中主键和外键的设计原则相关推荐
- mysql主键和外键示例_SQL数据库中主键和外键的应用实例
数据库 什么是数据库主键(Primary Key)? 数据库主键(Primary Key):指的是一个列或多列的属性组合,其属性值能唯一标识一条记录,通过它可强制表的实体完整性. 例如: (tb_Bo ...
- 聊聊数据库中的关键字——字段、属性、列、元组、记录、表、主键、外键
学完数据库,我们对SQL SERVER 2008中的部分关键字有了大概的了解,下面我来总结一下几个比较重要的关键字:字段.属性.列.记录(元组).表.主键.外键. 一.字段:某一个事物的一个特征,或者 ...
- mysql中主键外键的作用_数据库主键和外键的作用以及索引的作用,它的优缺点是什么?...
定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证 ...
- 在数据库什么是主键与外键
在数据库什么是主键与外键 2008-03-05 15:03 这需要理清几个概念: 1)候选键: 关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了,这样的 ...
- 小知识系列:数据库的主键和外键
文章目录 简介 创建主键 MySQL Oracle SQL Server 创建外键 mysql Oracle SQL Server 总结 简介 数据库是我们所有应用程序的基础,没有数据库的程序不是一个 ...
- 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...
- 菜鸟学数据库(四)——超键、候选键、主键、外键
这些年的一些经历告诉我,很多初学者搞不清超键.候选键等,被数据库中的各种键搞的一头雾水.下面就跟大家一起聊聊数据库中的那些键. 首先看看各种键的定义: 超键(super key):在关系中能唯一标识元 ...
- 数据库的主键和外键总结
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) ...
- oracle 其他用户表主键,Oracle中查看所有的表,用户表,列名,主键,外键
在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...
最新文章
- 深度揭秘阿里移动端高性能动态化方案Weex
- PHP 缓存插件之 Zend Opcache ( 取代 APC )
- linux 超级权限图标,Linux下使用iconv库出错,急!!!
- IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合
- 【疑问】SD更新凭证流
- ReactiveCocoa 更优雅的编程(信号探秘)
- 4. time datetime 时间模块
- 【牛客 - 1080D】tokitsukaze and Event(最短路,思维)
- PHP 2014.5.21的总结:
- bootstrap模态框垂直居中显示
- 新氧科技成为互联网医疗美容第一股 首日股价疯狂上涨32%
- 深入理解Linux系统中的用户和组账号
- WinForm 单例模式实例
- 图书管理系统软件测试报告_软件测试新手入门小知识点,一定要牢记
- bazel proxy 设置
- 使用 Office Web 组件参考文档
- 日语输入法(OpenWnn)的代码学习以及修改记录
- Smalltalk的变量
- 开源WEBGIS(五)WEBGIS五剑客之GIS服务
- RecycleBin
热门文章
- android闹钟——原代码【转】
- 无任何网络提供程序接受指定的网络路径 or No network provider accepted the given network path 的解决方法...
- OpenCV:详解掩膜mask
- Android—多版本主要适配内容
- java根据文件路径读取文件_java根据路径读取文件
- 决策树分类python代码_分类算法-决策树 Decision Tree
- office2016中插入公式心得
- if test 多条件_if函数进阶篇 嵌套+多条件判断
- linux 快速启动程序,在Linux上安装ULauncher快速启动应用程序的方法
- botley编程机器人测评_浅谈少儿编程教育启蒙----教具篇