如果要设计好数据库,首先是表结构设计要合理,这其实隐含了数据库的范式的内容,但是我们不会刻意去遵守范式的要求,正如我们的代码包含设计模式,但是为优先考虑业务需要,而不是规范的模式。
数据库有6个范式,主要用来指导数据库设计的,很多原则感觉是习以为常的,但是在实际中不怎么提到,而是会根据实际情况设计自己满意的表结构,但是这个还是需要梳理一下的,方便指导实际开发,否则自己可能很快就不满意了。
与设计模式不同的是,这些范式从1到5要求是逐步提高的。

从低到高主要有:1NF、2NF、3Nf、BCNF、4NF、5NF。

1NF 第一范式

强调属性的原子性约束,要求属性具有原子性,不可再分解。
举例:
学生表(学号、姓名、年龄、性别、地址)。地址可以细分为国家、省份、城市、市区、街道,那么该模式就没有达到第一范式。
第一范式存在问题:冗余度大、会引起修改操作的不一致性、数据插入异常、数据删除异常。
当然这个是相对的,一般地址就是一条字符串,这么写也是大部分场景都用的,如果要细究,则可以考虑再分。

2NF 第二范式

第二范式,强调记录的唯一性约束,数据表必须有一个主键,并且没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
举例:
版本表(版本编码,版本名称,产品编码,产品名称),其中主键是(版本编码,产品编码),这个场景中,数据库设计并不符合第二范式,因为产品名称只依赖于产品编码。存在部分依赖。所以,为了使其满足第二范式,可以改造成两个表:版本表(版本编码,产品编码)和产品表(产品编码,产品名称)

3NF 第三范式

第三范式,强调数据属性冗余性的约束,也就是非主键列必须直接依赖于主键。也就是消除了非主属性对码的传递函数依赖。
举例:
订单表(订单编码,顾客编码,顾客名称),其中主键是(订单编码),这个场景中,顾客编码、顾客名称都完全依赖于主键,因此符合第二范式,但顾客名称依赖于顾客编码,从而间接依赖于主键,所以不能满足第三范式。如果要满足第三范式,需要拆分为两个表:订单表(订单编码,顾客编码)和顾客表(顾客编码,顾客名称)。
说明:3NF的模式肯定满足2NF。产生冗余和异常的两个重要原因是部分依赖和传递依赖。3NF模式中不存在非主属性对码的部分函数依赖和传递函数依赖,性能较好。1NF、2NF一般不适合作为数据库模式,通常需要转换为3NF或者更高级别的范式,这种变换过程称为关系模式规范化处理。

BCNF范式

属于修正的第三范式,是防止主键的某一列会依赖于主键的其他列。当3NF消除了主属性对码的部分函数依赖和传递函数依赖称为BCNF。
特性:
1、所有主属性对每一个码都是完全函数依赖
2、所有主属性对每一个不包含它的码,也是完全函数依赖
3、没有任何属性完全函数依赖与非码的任何一组属性
举例:库存表(仓库名,管理员名,商品名,数量),主键为(仓库名,管理员名,商品名),这是满足前面三个范式的,但是仓库名和管理员名之间存在依赖关系,因此删除某一个仓库,会导致管理员也被删除,这样就不满足BCNF。

4NF 第四范式

非主属性不应该有多值。如果有多值就违反了第四范式。4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。
举例:用户联系方式表(用户id,固定电话,移动电话),其中用户id是主键,这个满足了BCNF,但是一个用户有可能会有多个固定电话或者多个移动电话,那么这种设计就不合理,应该改为(用户id,联系方式类型,电话号码)。
说明:如果只考虑函数依赖,关系模式规范化程度最高的范式是BCNF;如果考虑多值依赖则是4NF。

5NF 第五范式

第五范式属于最终范式,消除了4NF中的连接依赖,第五范式需要满足以下要求:
1、必须满足第四范式
2、表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。
一般实际应用中不必考虑第五范式。

数据库系列6:数据库的6个范式相关推荐

  1. MySQL数据库系列之数据库设计原则

    MySQL中数据库设计原则: 1.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.数据类型不一样,存储的执行效率也不一样.最好使用适度的整型数据类型,例如int之类的数据,这样在做查询或者字段 ...

  2. 【数据库系列】数据库基本知识点整理

    文章目录 一.基本概念 1.数据模型 2.主键与外键 3.事务 4.索引 5.视图 二.SQL语句 1.数据定义 1)CREATE TABLE 2)ALTER TABLE 3)DROP TABLE 2 ...

  3. django 获取 axios get 过来的数据_一起DevOps系列12django数据库创建与使用

    前面的文章,已经分享过数据库的原理,设计与开发的范式,以及根据我们django项目的需求,进行了数据库的设计.另外也介绍过数据库操作的基本SQL命令. 一起DevOps系列10--数据库设计与开发的范 ...

  4. 数据库系列(5)-数据库设计之规范化理论

    一.概述 数据库标准化是EF Codd在1970年代开发的,是许多数据库设计的标准要求.规范化是一种可以帮助您避免数据异常和管理数据的其他问题的技术. 目的: 消除数据冗余(因此使用更少的空间) 使更 ...

  5. 死磕数据库系列(二十):MySQL 数据库 DDL、DML、DQL、DCL 语言理论与实践(sql 8.0 版)...

    点关注公众号,回复"1024"获取2TB学习资源! 今天,民工哥带大家一起来学习一下 MySQL 数据库的 DDL.DML.DQL.DCL 这几种语言的理论知识与实践.如有帮助,请 ...

  6. 数据库系列(2):数据库系统的发展

    数据库系统的应用 数据库系统已经应用到我们生活的方方面面,我们都直接或者间接的和数据库系统打交道,当我们浏览一本书或者听一首音乐时,其实我们正在访问某个数据库里的内容:我们用外卖软件点餐,打车软件打车 ...

  7. 数据库规范化,数据库范式,和规范化实例

    文章目录 什么是数据库规范化 术语 数据库的3个范式介绍 第一范式 第二范式 第三范式 根据数据库范式优化数据库结构 满足第一范式 满足第二范式 满足第三范式 参考链接 什么是数据库规范化 维基百科的 ...

  8. SQL Server 2008高可用性系列:数据库快照

    SQL Server 2008高可用性系列:数据库快照 http://database.51cto.com  2010-09-13 14:45  我爱菊花  博客园  我要评论(0) 摘要:我们今天要 ...

  9. redis系列之数据库与缓存数据一致性解决方案

    redis系列之数据库与缓存数据一致性解决方案 参考文章: (1)redis系列之数据库与缓存数据一致性解决方案 (2)https://www.cnblogs.com/jiawen010/p/1215 ...

  10. Linux7如何手动建库,Centos 7系列删除数据库并重新安装

    Centos 7系列删除数据库并重新安装 也不知道是因为什么,今天我在云主机上边安装的mysql突然就连接不上了,总是报 ERROR 2002(HY000): Can't connect to loc ...

最新文章

  1. 函数 —— 分析命令行参数 getopt() getopt_long() getopt_long_only()
  2. 接口作为参数,不同的接口调用不同的方法,例如:输出“I love Game”或输出“我喜欢游戏”...
  3. 给windows设置隐藏文件夹的方法
  4. 使用jupyter notebook连接服务器进行远程写代码
  5. 内容分发网络 CDN 是如何提高网页加载时间的?
  6. 关于RESTful一些注意事项,接口开发规范
  7. 计算机科学与软件工程的区别
  8. varnish几个工具命令行工作情况
  9. 华为Mate 40系列预热海报颠覆传闻:这个设计手机圈独树一帜
  10. splunk 提取字段_splunk 学习笔记之三[使用字段查找对照]
  11. runtime 分类结构体_几种常见滚动轴承的分类方法
  12. 会装64位solaris jdk1.6吗?
  13. WinXP中自带的netsh命令自动切换IP(zz)
  14. 一位前端工程师的Writing better code
  15. java自动阅卷判断选择题,客观题型自动阅卷系统(管道过滤器模式)
  16. 【机房报修管理系统】1.简介篇 机房报修管理系统简介
  17. 阿里云 OSS + CDN 部署静态网站配置
  18. 从零开始学统计 02 | 总体参数
  19. 数据库服务器文件路径,服务器数据库的文件路径
  20. 【软件测试】资深测试聊一聊,测试架构师是怎么样的,做一名成功的测试工程师......

热门文章

  1. Maven进行测试Test
  2. qt实现的pdf阅读器(二)--XpdfReader在linux下的编译
  3. MRBS 会议室预订系统 完整汉化翻译 修改
  4. 智能仓储与人工智能结合:打造智能化物流系统
  5. 如何使用BBC英语学习频道
  6. windows cmd命令netsh命令设置wifi连接
  7. 安卓手机截图 所需要的软件 (不需要手机root)
  8. Illumina下机数据bcl格式转为fastq
  9. 把文件存到桌面不占C盘空间
  10. LeetCode Java刷题笔记—297. 二叉树的序列化与反序列化