首先,数据库范式的意义是在设计数据库是尽量去掉数据冗余。然而过分的精简并不一定能够带来更高的效率,所以具体问题还要具体分析,不是一定要达到更高的范式要求的。
1NF
属性的原子性。即数据库各列中不能含有组合列,如地址属性不能为区和街道的组合。
2NF
非主属性要完全依赖于码,也就是说码是作为一个整体来决定非主属性的,不能由其中一部分就能做决定。
如属性A、B、C、D 其中(A、B)为主键,如果存在B->C那么就不符合第二范式。
解决方法是把B、C抽取出来放到新表中。
3NF
非主属性之间没有传递依赖,也就是非主属性没冗余信息。
如表(A、B、C、D),其中(A、B)为主键,如果存在C->D,那么就不符合第三范式。
解决方法是把C、D抽出来建个新表。
BCNF
就是在依赖函数中,左侧起决定作用的必须包含候选码。
偷个百科的例子:
这些只是用来记忆范式的小理解,不严谨也不科学,能用来判断违反范式的情形,不能作为充要条件。
姑且用来应付笔试题。