关系数据库三个范式

三个范式:

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性

这里说的不可拆分通常是放在业务背景下而言的,是否可拆分视业务需求而定。如一张student表的adress表存省市县时,如果业务需要针对更细粒度地址如市、县做些CRUD操作则需要adress字段拆成province、city等字段。

第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情

如包含school_name、school_address字段的student表中,school_address是依赖于school而非student的,故应将school信息抽离到单独的表中。

第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)

上述school信息抽离到单独表后,student表中只需有school_id(外键)来关联school即可,而不需要其他school相关属性,因为其他school属性直接依赖于school_id而非student_id

区别:

第 一范式和第二范式在于有没有分出两张表,第二范式是说一张表中包含了多种不同的实体属性,那么要必须分成多张表, 第三范式是要求已经分成了多张表,那么一张表中只能有另一张表中的id(主键),而不能有其他的任何信息(其他的信息一律用主键在另一表查询)

总结:

第一范式:每个表中都有1列,并且该列是不可拆分的最小单元

第二范式:1张表只描述一件事情

第三范式:用外键做表的关联

数据库范式只是理论上建议这样设计,实际中结合业务需要可视情况稍有违背,而不是死脑筋一味地按该范式来。

最新文章

  1. ASP.net之策略模式
  2. [Django]模型学习记录篇--基础
  3. 物联网(莹石云)WIFI一键配置原理分析(zz)
  4. 分享一个U3D在Runtime显示碰撞盒的插件
  5. Unity手游之路<十二>手游资源热更新策略探讨
  6. GCD编程 之 略微提高篇
  7. Gitolite配置管理和GIT基本操作
  8. javascript学习之位置获取
  9. sdutoj 2607 Mountain Subsequences
  10. SAP BW顾问如何保持市场竞争力
  11. 网站开发常用jQuery插件总结(14)图片修剪插件Jcrop
  12. fence repair(队列水过)
  13. GET POST方法长度限制
  14. 兼容现有jQuery API的轻量级JavaScript库:Zepo
  15. C#_会员管理系统:开发三(修改密码)
  16. SeaJS之shim插件:解决非cmd规范的插件与sea的区别
  17. iOS知识点、面试题 之二
  18. OE1、OE2、ON1、ON2路由有什么区别?
  19. 自增ID算法snowflake - C#版
  20. Flink - Asynchronous I/O

热门文章

  1. 2017-9-7-Linux Mint TFTP服务安装开启
  2. python之迭代器篇
  3. 开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证
  4. .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
  5. Ubuntu安装最新版nodejs
  6. HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-下篇
  7. List集合序列排序的两种方法
  8. zookeeper视图工具
  9. redis批量删除key 远程批量删除key
  10. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习