首页 > 编程知识 正文

如何设计数据库,数据库三大范式简单理解

时间:2023-05-05 15:48:44 阅读:168146 作者:714

范式的转变

1NF:字段不可分离;

2NF:有主键,非主键字段取决于主键;

3NF:非主键字段不能相互依赖;

说明:

1NF:原子性字段不能重新分割。 否则,它不是关系数据库

2NF:唯一的表只说明一个东西;

3NF:各列与主键直接相关,无转发依赖;

第一范式(1NF ) )。

也就是说,表的列是原子性的,不可再分解。 即,列的信息是不可分解的,只要数据库是关系数据库(MySQL/Oracle/DB2/Informix/sysbase/SQL server ),就会自动满足1NF。 数据库的每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子数据项。 如果实体中的一个属性有多个值,则必须将其拆分为不同的属性。 常见的理解是一个字段只能存储一条信息。

关系数据库: MySQL/Oracle/DB2/Informix/sysbase/SQL server非关系数据库3360 (特征:面向对象或集合) NoSql数据

第二范式(2NF ) )。

第二范式(2NF )基于第一范式) 1NF )构建,即要满足第二范式(2NF )必须首先满足第一范式) 1NF )。 第二正则表达式(2NF )必须能够唯一区分数据库表中的每个实例或行。 为了实现区分,通常需要设计和实现主键。 主键不包含业务逻辑。

也就是说,满足第一模式的前提,且存在多个主键的情况下,才会发生不符合第二模式的状况。 例如,有两个主键,不能存在这样的属性。 它只取决于其中一个主键。 我的意思是,这不符合第二范式。 很容易理解的是,所有字段都只依赖于表中的同一字段。 (涉及表格分割)

请看下面的学生选择列表:

学额课程成绩课程学分

10001

数学

100

6

10001

国语

90

2

10001

英语

85

3

10002

数学

90

6

10003

数学

99

6

10004

国语

89

2

表中的主键为(学号、课程),可以表示为(学号、课程)-)成绩、学分),表示所有非主键列)成绩、学分)取决于主键)学号、课程)。 但是,表中还有一个依赖。 (课程)-) (以课程为单位)。 这样是非主键列“课程单位‘依赖于一部分主键列’的课程”,所以上表不满足第二范式。

把这个分解成以下两张表。

学生选择列表:

学校号码课程成绩

10001

数学

100

10001

国语

90

10001

英语

85

10002

数学

90

10003

数学

99

10004

国语

89

课程信息表:

课程学分

数学

6

国语

3

英语

2

那么,上面2个表,学生选择表的主键是[学校号码、课程],课程信息表的主键是[课程],表中所有的非主键列完全依赖于主键。 不仅符合第二范式,也符合第三范式。

请看这样的学生信息表:

学号名性别班sdhm

10001

张三

男人

一班

mhddy

10002

李四

男人

一班

mhddy

10003

王五

男人

两班

小李

10004

张小三

男人

两班

小李

在上述表中,主键是()学校号码),所有字段)、姓名、性别、班级、sdhm )是主键)、学校号码),对主键没有部分依存。 所以就是要满足第二范式。

第三范式(3NF ) )。

要满足第三范式(3NF ),首先必须满足第二范式(2NF )。 这意味着第三种模式(3NF )要求一个数据库表不包含已经包含在其他表中的非主键字段。 即,表的信息如果能够导出,则不应该单独设计并存储字段(如果能得到外键join,则使用外键join )。 在很多情况下,我们为了满足第三范式往往将一个表分为多个表。

也就是说,满足第二模式的假设,如果一个属性依赖于另一非主键属性,而另一非主键属性依赖于主键,那么该属性间接地依赖于主键,这被称为直通依赖主属性。 一般解释是,一个表最多只存储两个相同类型的信息。

反范式

无冗馀数据库并不一定是最好的数据库,为了提高操作效率和读取性能,可能必须降低规范化标准,妥善保留冗馀数据。 具体来说,在概念数据模型设计中,遵守第三范式,降低范式标准的工作在物理数据模型设计中进行考虑。 降低范式是增加字段,减少查询时的关联,提高查询效率。 这是因为在数据库操作中查询的比例远大于DML的比例。 但反范式要适度,本来要在满足三范式的基础上进行调整。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。