- 规范化的目的
- 基本概念
- 主键的选择
- 表结构设计的原则
- 常见疑虑
*数据库就是产品的地基,地基打不好,这个产品时刻都有潜在的危险。
一、规范化的目的
- 良好的数据库设计:
节省数据的存储空间
能够保证数据的完整性 - 糟糕的数据库设计:
数据冗余、存储空间浪费
数据删除、更新和插入的异常
带来系统软bug
二、基本概念
主码:也叫主键,能唯一地确定一条记录;是表中的属性或属性组;(唯一且不可更改【如:身份证号】)
候选码:也叫候选键,可以作为主码的码;
主属性:包含在任一候选键中的属性;
实体:客观存在的可以被描述的事物(用户,课程等)。
例1:设有关系模式SC(Sno,Sname,Cno(课程号),Credit(学分),Grade),其中主键为(Sno,Cno)
Sno -> Sname 姓名完全函数依赖于学号;
(Sno,Cno)->Sname 姓名部分函数依赖于学号和课程号;
(Sno,Cno)-> Grade 成绩完全函数依赖于学号和课程号。
例2:设有关系模式S(Sno,Sname,Sdept(所在系),Dep_master(系主任)),主键为Sno
Sno->Sdept 所在系完全函数依赖于学号;
Sdept->Dept_master 系主任完全函数依赖于所在系;
因此:Sno->Dept_master 系主任传递函数依赖于学号。
三、主键的选择
1、人工键:实体的非自然属性
2、自然键:实体本身的属性
四、表结构设计的原则
自然二维表
首先,经过一系列对需求的提炼,整理出来的表,称为自然二维表。
第一范式(1NF)
消除自然表中属性的非原子性后,就满足1NF。
第二范式(2NF)
消除非主属性对码的部分函数依赖。
第三范式(3NF)
消除非主属性对码的传递函数依赖。
BC范式*
消除主属性对码的部分和传递函数依赖。
第四范式(4NF)
消除不是由候选码蕴含的非平凡的多值依赖。
第五范式(5NF)
消除不是由候选码蕴含的连接依赖。
五、常见疑虑
1、每个表都可以设置唯一且不可更改的自增id为主键,为什么还要费劲选主键?
- 如果表中已经存在唯一且不可更改的字段,就没必要再使用一个自增主键,浪费存储空间
- 导入旧数据时,可能会ID重复,导致导入失败
- 防止注入式攻击(get请求)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。