感谢慕课网 sqlercn老师
一些术语
关系:一个关系对应通常所说的一张表。
元组:表中的一行即为一个元组。
属性:表中的一列即为一个属性,每一个属性都有一个名称,成为属性名。
候选码:关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质了。(即该属性组内不应该存在一个真子集也能标识一个元组)。这样的属性组称作候选码。
主键:当有多个候选码时,可以选定一个作为主码,选定的候选码称主键。
外键:关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码或外键。
域:属性的取值范围。
分量:元组中中的一个属性值。
数据库设计范式
第一、第二、第三、第四、第五,BC范式。
第一范式(1NF)
定义:数据库表中的所有字段都是单一属性,不可再分的。(第一范式要求数据库中的表都是二维表。)
第二范式(2NF)
定义:数据库中的表中不存在非关键字段对任一候选关键字段的部分函数依赖。部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。
换句话说:所有单关键字段的表都符合第二范式。
由于供应商和商品之间是多对多的关系,只有使用商品名称和供应商名称才可以唯一标识出一件商品。商品名称和供应商名称是一组组合关键字。
上表中存在以下的部分函数依赖关系
(商品名称)->(价格,描述,重量,商品有效期)
(供应商名称)->(供应商电话)
第三范式(3NF)
定义:第三范式是在第二范式的基础之上定义的,如果数据表中不存在非关键字段对任意候选关键字段的传递函数依赖则符合第三范式。
BC范式
Boyce.Codd范式(BCNF)
定义:在第三范式的基础之上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。
如果是复合关键字,则复合关键字之间也不能存在函数依赖关系。
不过老师BC范式讲的有点问题 要是拆分后 怎么确定饮料一厂 商品ID为2 就不能对应张三??
设计:
- 避免使用触发器
- 时间可以用int或datetime 各有好处
- 严禁使用留预留字段
- 字段名最好能读懂
好处:
- 减少表的关联数量
- 增加数据的读取效率
- 反范式化一定要适度