数据库:数据库设计三范式

来源:互联网 发布:sql 字段名为变量 编辑:程序博客网 时间:2024/06/05 19:46

第一范式:

不要向表中输入重复的值 ! 要有主键

                                                  表1 学生表 

在表中有成千上万条数据的时候,如果没有规则的存在,可能会有很多重复的数据。解决这类问题的办法是设立一个主键,主键用来标识唯一的一条记录,并且不可重复
在多个字段可以被选择的情况下,作为主键的字段应该选择最符合逻辑的一个,一般选择与业务无关的字段,比如自增的Id。

由于效率的关系,请尽量选择一个数值类型的字段或者定长字符串。

很明显email字段也不会重复,理论上也可以作为主键,但是效率低下。所以还是用学号作为主键。

第二范式:

存在多对多关系时只有一个字段作为主键是不够的。

譬如学生和老师的关系,他们之间是多对多的关系,一个学生可以同时学习多个老师的课,而一个老师可以同时教多名学生,很明显单独用学生学号或单独用老师编号都不足以确定一条记录,需要把学号和教师编号的组合作为主键。但是学生姓名是依赖于学号的,不依赖教师编号,而教师姓名是依赖教师编号而不依赖学号,也就是说存在部分依赖,这个时候容易产生部分依赖,会产生冗余数据,
解决这个问题的方案是把这个表分解为三个表,建立中间关联表。

分解结果:

这样每张表都不存在冗余数据,并且通过表连接可以得到任意需要的数据,这种表之间不存在部分依赖的情况,称之为符合第二范式。

第三范式:

一对多的关系。如果学生表中是这样的数据

一个班级可以拥有多个学生,一个学生只能属于一个班级,但是很明显班级名称和班级信息存在大量重复的出现,这些值并不直接依赖于学号(主键),而是依赖于班级号,也就是时说表中出现了传递依赖,即从学号传递到班级号,又从班级号传递到班级名称,一旦有传递依赖的存在,表中就会有大量的冗余数据。
解决这个问题的办法是把这些和学号(主键)没有直接联系的信息记录的新的表里面,即班级表。因此,只在学生表中记录班级编号就可以了,如果想查询班级名称,就想雇员表emp和部门表dept一样,把两张表做连接,到班级表中取查询就可以了!(在多的一方加外键)

原创粉丝点击