数据库设计的三大范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:
1.第一范式
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。
用户信息表
编号 |
姓名 |
性别 |
年龄 |
联系电话 |
省份 |
城市 |
详细地址 |
1 |
张红欣 |
男 |
26 |
0378-23459876 |
河南 |
开封 |
朝阳区新华路23号 |
2 |
李四平 |
女 |
32 |
0751-65432584 |
广州 |
广东 |
白云区天明路148号 |
3 |
刘志国 |
男 |
21 |
0371-87659852 |
河南 |
郑州 |
二七区大学路198号 |
4 |
郭小明 |
女 |
27 |
0371-62556789 |
河南 |
郑州 |
新郑市薛店北街218号 |
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。
订单信息表
订单编号 |
商品编号 |
商品名称 |
数量 |
单位 |
价格 |
客户 |
所属单位 |
联系方式 |
001 |
1 |
挖掘机 |
1 |
台 |
1200000¥ |
张三 |
上海玖智 |
020-1234567 |
001 |
2 |
冲击钻 |
8 |
把 |
230¥ |
张三 |
上海玖智 |
020-1234567 |
002 |
3 |
铲车 |
2 |
辆 |
980000¥ |
李四 |
北京公司 |
010-1234567 |
这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。
订单信息表
订单编号 |
客户 |
所属单位 |
联系方式 |
001 |
张三 |
上海玖智 |
020-1234567 |
002 |
李四 |
北京公司 |
010-1234567 |
订单项目表
订单编号 |
商品编号 |
数量 |
001 |
1 |
1 |
001 |
2 |
8 |
002 |
3 |
2 |
商品信息表
商品编号 |
商品名称 |
单位 |
商品价格 |
1 |
挖掘机 |
台 |
1200000¥ |
2 |
冲击钻 |
个 |
230¥ |
3 |
铲车 |
辆 |
980000¥ |
这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。
3.第三范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。
订单信息表
订单编号 |
订单项目 |
负责人 |
业务员 |
订单数量 |
客户编号 |
001 |
挖掘机 |
刘明 |
李东明 |
1台 |
1 |
002 |
冲击钻 |
李刚 |
霍新峰 |
8个 |
2 |
003 |
铲车 |
郭新一 |
艾美丽 |
2辆 |
1 |
客户信息表
客户编号 |
客户名称 |
所属公司 |
联系方式 |
1 |
李聪 |
五一建设 |
13253661015 |
2 |
刘新明 |
个体经营 |
13285746958 |
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。
转载自:
http://www.cnblogs.com/zhhh/archive/2011/04/21/2023355.html
转载于:https://www.cnblogs.com/colder/archive/2012/03/18/2404513.html
数据库设计的三大范式相关推荐
- mysql增删改查不区分大小写吗_MySQL的增删改查语句以及数据库设计的三大范式...
数据库设计的三大范式: 1.列的原子性,即列是不可再分的 2.表里的每一列都应该与主键有关系, 3.表里的每一列都应该与主键有直接关系, 当使用自增长列不满足2.3范式,是特殊例子,只用在解决较为复杂 ...
- 5、数据库设计的三大范式
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中,这种规则就是范式.范式是符合某一种级别的关系模式的集合.关系型数据库中的关系必须满足一定的要求,即满足不同的范式. ...
- 数据库设计的三大范式:详细
在大学学习数据库的时候,不明白为什么会学习很多关系代数.设计范式的理论.但是,有了这些理论基础,在遇到问题的时候脑袋会有灵光一闪的感觉.那种感觉很像是大雾天太阳照射大地的感觉,心中一片光亮.^_^ 那 ...
- 数据库设计常用三大范式
前言 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小. 目前关系数据库有六种范式:第一范式(1NF). ...
- 数据库设计的三大范式(举例详解)
为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就被称为范式.范式是符合某一种设计要求的总结.因此要设计一个结构合理的关系型数据库,就必须要满足下面这三大 ...
- 浅聊数据库设计的三大范式
写在最前 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中,这种规则就是范式.范式是符合某一种级别的关系模式的集合.关系型数据库中的关系必须满足一定的要求,即满足不 ...
- 数据库设计的三大范式通俗解释
一.三大范式通俗解释: (1)简单归纳: 第一范式(1NF):字段不可分: 第二范式(2NF):有主键,非主键字段依赖主键: 第三范式(3NF):非主键字段不能相互依赖. (2)解释: 1NF:原子性 ...
- 数据库设计的三大范式、BCNF、4NF
一.理解数据库的范式需要理解几个基本概念: 码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码.相当于键值的意 ...
- 数据库设计的三大范式[学习笔记]
* 概念:设计数据库时,需要遵循的一些规范.要遵循后边的范式要求,必须先遵循前边的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种 ...
最新文章
- 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示
- [YTU]_2866(结构体---点坐标结构体)
- java src 文件路径_java中获得src路径下文件的常用方法
- 【转】BI 入门: 体系架构及相关技术
- 链表面试题1:反转单链表,不带头结点。
- excel公式:用countif、match、index合并同类项
- pyqt怎么button怎么链接_SEO内部链接怎么优化
- ORACLE expdp/impdp导出实例
- Java中的非对称加密算法RSA实现
- PAT 乙级 1005. 继续(3n+1)猜想 (25) Java版
- (25)软件工程开发规范
- 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程
- SECS/GEM封装库金南瓜平台(一)简介
- Kubernetes PV与PVC
- 华为AR路由器无法上网解决办法
- Java输入某年某月某日,判断这一天是这一年的第几天?
- 深入理解AQS之ReentrantReadWriteLock详解
- 关于压电式雨量传感器技术相关问答的回复
- 【Linux Centos6/7连接Oracle11g数据库,提示:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务】
- 大连民族学院计算机科学与工程学院,赵丕锡 - 大连民族大学 - 计算机科学与工程学院...
热门文章
- 2021-2027年中国透明熔融石英管行业市场全景调查及投资前景分析报告
- JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性
- 2022-2028年中国橡胶漆产业发展动态及未来趋势预测报告
- 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
- 汇编语言关于8086CPU多种寻址方式总结
- Intel发布FPGA
- GStreamer 1.18.4稳定的错误修复版本
- AMD–7nm “Rome”芯片SOC体系结构,支持64核
- 多传感器融合:自动驾驶(下)
- 自监督学习(Self-Supervised Learning)多篇论文解读(上)