避免以下:
数据冗余:
一列数据可以其他列也有,或可由其他列计算所得
维护异常
插入异常:
表中的一个实体随另一实体存在,
比如只有[选课表],没有课程表,学生和 课 是联合主键,没有学生id只有想插入数学课10学分 不能insert数据,
更新异常:
改一个要改很多,比如数学课学分要更新,[选课]表要更新很多行数据
删除异常:
删一个数据要删很多
以后不开数学课了,[选课表]....
范式
:遵循之设计出的数据库就不会有冗余和维护异常
- 第一:
1.所有字段都只具有单一属性,不能再分解,
2.都是基本数据类型构成如整形字符串浮点,
3.都是二维表 - 第二:
如果是组合主键,不能有数据只依赖部分主键,
比如 [选课表]里面学号+课程号 是主键.有课程学分字段,只依赖课程号,就违反了,课程学分只能在课表 - 第三
消除非主属性对主属性的传递依赖
如这里 学院地址对学院名称传递依赖了
该分出一个学院表
总结就是:
- 字段可拆,
- 表可拆(传递依赖)
- 对组合主键其中的一个
- 对非主键
反范式
但是,读远多于写
为了查询性能考虑,空间换时间,适当增加数据冗余