博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库 三大范式
阅读量:6431 次
发布时间:2019-06-23

本文共 1073 字,大约阅读时间需要 3 分钟。

hot3.png

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

                 

在实际开发中最为常见的设计范式有三个:

1.第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表, 每一列属性都是不可再分的属性值,确保每一列的原子性,就说明该数据库表满足了第一范式。

第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到地址这个属性,本来直接将地址属性设计成一个数据库表的字段就行。但是如果系统经常会访问地址属性中的城市部分,那么就非要地址这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。

 

编号

姓名

性别

年龄

省份

城市

详细地址

1

张三

23

北京

北京

朝阳区新华路23

 

上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。

                

2.第二范式(不能部分依赖)

第二范式是在满足第一范式的基础上,要求每列的属性必须完全依赖于主关键字

学生Id

姓名

身份证号

课程Id

课程名称

1

张三

12345666

1

数学

1

张三

12345666

2

语文

 

比如,一个学生学多门课程,如果设计为上面一张表,一个学生就有多条数据,这样子学生信息是重复的,就会造成数据冗余。我们应该拆分成学生信息表,课程信息表以及学生课程关系表,三张表。

学生信息表

学生Id

姓名

身份证号

1

张三

12345666

1

张三

12345666

 

 

课程信息表

课程Id

课程名称

1

数学

2

语文

学生课程关系表

课程Id

学生Id

1

1

2

1

 

 

                 

3.第三范式(不能存在传递依赖)

第三范式是在满足第二范式的基础上,要求数据表中的每一列数据都和主键直接相关,而不能间接相关

比如设计的学生信息表如下,学校信息和学生Id不是直接相关的。

学生Id

姓名

年龄

性别

所在学校ID

学校名称

学校地址

1

张三

25

1001

北京大学

北京市***

 

拆分如下:

学生信息表

学生Id

姓名

年龄

性别

所在学校ID

1

张三

25

1001

 

学校信息表

所在学校ID

学校名称

学校地址

1001

北京大学

北京市***

 

转载于:https://my.oschina.net/lsl1991/blog/667976

你可能感兴趣的文章
从事互联网行业,怎样才能快速掌握一门编程语言呢?
查看>>
谈谈fail-fast与fail-safe是什么以及工作机制
查看>>
深入浅出换肤相关技术以及如何实现
查看>>
Redis 基础、高级特性与性能调优
查看>>
React native 第三方组件 React native swiper
查看>>
接口幂等设计
查看>>
编程入门指南
查看>>
移动端的自适应方案—REM
查看>>
你真的懂volatile吗
查看>>
Android 编译时注解-提升
查看>>
说说 Spring AOP 中 @Aspect 的高级用法
查看>>
Workbox CLI中文版
查看>>
贝聊亿级数据库分库分表实践
查看>>
同时连接gitlab和github
查看>>
vuex源码分析
查看>>
tornado+datatables分页
查看>>
集成 Kubernetes 与 Cloud Foundry,IBM自有一套
查看>>
php 中英文字符分割
查看>>
No module named yum
查看>>
Shell处理用户输入参数----getopts
查看>>