【SqlServer系列】数据库三大范式
1 概述
一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分;第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系,也就是完全依赖;第三范式确保主键列之间没有传递函数依赖关系,也就是消除传递依赖。
本文将基于三大范式原则,结合具体的实例做简要分析,难度系数:基础。
2 第一范式
2.1 例子引入
根据如下场景设计出两种数据表,请分析两种数据表的合理性。
问题:需求描述:数据库系统中需要一个实体表,该表用来存储用户信息,其中“地址”这个属性,要求查询到省份、城市和详细地址。 具体例子:
姓名:张红欣; 性别:男; 年龄:26岁; 联系电话:-23459876;省份:河南省;城市:开封; 详细地址:朝阳区新华路23号;
姓名:王艳; 性别:女; 年龄:25岁; 联系电话:-2348768; 省份:贵州省;城市:贵阳市;详细地址:南明区南明区狮峰路6号;
姓名:汪梅; 性别:女; 年龄:21岁; 联系电话:-3876450; 省份:浙江省;城市:杭州市;详细地址:滨江区滨康路352号;
第一种表设计

第二种表设计

2.2 分析
第一种表设计不满足第一范式,为什么不满足第一范式?因为region列不具有原子性,能拆分成省份、市和具体地址;
3 第二范式
3.1 例子引入
根据如下场景设计出两种数据表,请分析两种数据表的合理性。
需求描述:设计一个订单信息表,订单有多种商品,将订单编号和商品编号作为联合主键。
第一种表设计

第二种表设计

3.2 分析
第一种表设计不满足第二范式 ,订单编号和商品编号作为联合主键,由于商品名称,单位,价格这几列只与商品编号有关,与订单编号无关,因此与主键(联合主键)无关,违反范式第二原则;
第二种表设计满足第二范式,把第一种设计表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中。
4 第三范式
4.1 例子引入
根据如下场景设计出两种数据表,请分析两种数据表的合理性。
需要在数据库中存储如下信息:
学生编号;学生卡号;用户ID号;操作员级别;操作日期;操作时间;
第一种表设计

第二种表设计


4.2 分析
第一种表设计不满足第三范式,在表中,一个UserID能确定一个UserLevel。这样,UserID依赖于StudentNo和CardNo,而UserLevel又依赖于UserID,这就导致了传递依赖,3NF就是消除这种依赖。
第二种表设计满足第三范式,将第一种表格拆分成成两个表格。
5 参考文献
【01】http://www.cnblogs.com/springside-example/archive/2011/10/06/2530207.html
【02】http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html#undefined
6 版权
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
- 可以转载该博客,但必须著名博客来源。
【SqlServer系列】数据库三大范式的更多相关文章
- SqlServer之数据库三大范式
分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依 ...
- 数据库三大范式(1NF,2NF,3NF)及ER图
数据库三大范式(1NF,2NF,3NF)及ER图 百度官方解释: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据 ...
- 数据库三大范式和反范式 · oldmee
后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...
- java数据库三大范式
引用知乎网友@ 王红波的回答 一范式就是属性不可分割.属性是什么?就是表中的字段.不可分割的意思就按字面理解就是最小单位,不能再分成更小单位了.这个字段只能是一个值,不能被拆分成多个字段,否则的话,它 ...
- django----中使用事务 数据库的三大范式
目录 orm中的事务操作 ⑴ 原子性(Atomicity) ⑵ 一致性(Consistency) ⑶ 隔离性(Isolation) ⑷ 持久性(Durability) django中使用事务 数据库三 ...
- 【SqlServer系列】表单查询
1 概述 如下几个问题,如果你能解决,请继续往下看,若不能解决,请先复习SQL基础知识,再来阅读本篇文章.本篇文章深度中等左右. Q1:表StudentScores如下,用一条SQL语句查询出每门 ...
- 【SqlServer系列】表连接
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]MYSQL安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 1.2 本篇 ...
- 【SqlServer系列】子查询
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...
- 【SqlServer系列】开启Sqlserver远程访问
1 概述 已发布[SqlServer系列]文章如下: [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlS ...
随机推荐
- MUI动态生成轮播图片
$$.ajax({ url:'http://localhost:8080/api/v1/food/listFeatureFood', type:'Get', xhrFields: {withCrede ...
- redis学习-集合set常用命令
redis学习-集合set常用命令 1.sadd:添加一个元素到集合中(集合中的元素无序的并且唯一) 2.smembers:查看集合中所有的元素(上图事例) 3.srem:删除结合中指定的元素 4 ...
- 1013. Battle Over Cities 用dfs计算联通分量
使用一个标记数组,标记 节点是否已访问 int 连通度=0 dfs(node i) {标记当前节点为以访问 for(每一个节点) {if(当前几点未访问 并且 从i到当前节点有直接路径) dfs(当前 ...
- java中的接口与继承,接口的例子讲解
extends 继承类:implements 实现接口. 简单说: 1.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承, 2.JAVA中不支持多重继 ...
- PIO学习
边沿捕获 PIO可以对输入进行边沿捕获,它可以捕获上升沿.下降沿和双沿,当检测到边沿时PIO会把它存在edgecapture 寄存器之内: 打开Synchronously capture 时,会生成一 ...
- How to setup Visual Studio without pain
Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...
- C++ 虚函数的两个例子
1. 第一个例子是朋友告诉我Qt中的某个实现 1 #include <iostream> 2 3 // Qt中的某个实现 4 class A{ 5 public: 6 A() = defa ...
- vue的学习之路
一.vs code中,适合vue的前端插件 查看网址:http://blog.csdn.net/caijunfen/article/details/78749766 二.如何使用git从gitub上拉 ...
- 与Servlet相关的类
有4个有关的类,通过servlet可以获得其中的三个,然后通过ServletConfig间接获取ServletContext.1. ServletConfig该类是在Servlet容器初始化Servl ...
- QEMU Networking
QEMU Networking QEMU has a number of really nice ways to set up networking for its guests. It can be ...