关系数据库(RDBMS)小记
关系数据库三个范式
三个范式:
第一范式(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张表只描述一件事情
第三范式:用外键做表的关联
数据库范式只是理论上建议这样设计,实际中结合业务需要可视情况稍有违背,而不是死脑筋一味地按该范式来。
最新文章
- ASP.net之策略模式
- [Django]模型学习记录篇--基础
- 物联网(莹石云)WIFI一键配置原理分析(zz)
- 分享一个U3D在Runtime显示碰撞盒的插件
- Unity手游之路<;十二>;手游资源热更新策略探讨
- GCD编程 之 略微提高篇
- Gitolite配置管理和GIT基本操作
- javascript学习之位置获取
- sdutoj 2607 Mountain Subsequences
- SAP BW顾问如何保持市场竞争力
- 网站开发常用jQuery插件总结(14)图片修剪插件Jcrop
- fence repair(队列水过)
- GET POST方法长度限制
- 兼容现有jQuery API的轻量级JavaScript库:Zepo
- C#_会员管理系统:开发三(修改密码)
- SeaJS之shim插件:解决非cmd规范的插件与sea的区别
- iOS知识点、面试题 之二
- OE1、OE2、ON1、ON2路由有什么区别?
- 自增ID算法snowflake - C#版
- Flink - Asynchronous I/O
热门文章
- 2017-9-7-Linux Mint TFTP服务安装开启
- python之迭代器篇
- 开源流媒体服务器SRS学习笔记(3) - HTTPCallback实现安全认证
- .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
- Ubuntu安装最新版nodejs
- HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-下篇
- List集合序列排序的两种方法
- zookeeper视图工具
- redis批量删除key 远程批量删除key
- Deep Learning.ai学习笔记_第一门课_神经网络和深度学习