数据库设计:关于范式的理解
前言:这是一篇我以前写的关于数据库设计当中范式理解的笔记,现在转到博客园上来。
书本上关于范式的内容太抽象,难易理解,更难记忆。所以去网上搜罗了一些资料,结合自己的经验,用较为直白的语言总结下关于范式的内容:
第一范式(1NF)
原文:如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
个人理解:设计一张表的字段的时候,要结合实际需求,设计详细完整的字段。
例如:设计一张投票的表时,如果只设计了一个“住址”的字段,而实际情况却是有关于“住址”的国家、城市、地区3个属性的值,那这个表设计的就是不合理的,不符合第一范式的。
第二范式(2NF)
原文:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则R∈2NF
个人理解:不要使用组合键作为码,而添加一个流水号ID,即可满足第二范式。
PS.第二范式要求数据库表中的每个实例或行必须可以被唯一地区分。
第三范式(3NF)
关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z ? Y), 使得X→Y,Y→Z,成立,则称R<U,F> ∈ 3NF。
简单的说:第三范式是为了消除数据库中关键字之间的依赖关系
个人理解:设计表的时候,结合实际功能需求,将一定的独立数据或者有依赖关系的数据,分离出去成为一张新的表。
例如:建用户表的时候,如果用户的权限分级较多,可以分离出一张角色表。再打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。
一般,一个数据库设计符合第三范式就可以了。在第三范式以上还有BC范式、第四范式、第五范式。但在绝大多数应用中不需要设计到这种程度。并且,某些情况下,过于范式化甚至会对数据库的逻辑可读性和使用效率起到阻碍。
一个严格恪守数据库设计范式来进行数据库设计的人,必定是个傻球;
一个没有研究过数据库设计范式就进行数据库设计的人,必定也是个傻球
上面这2句话是网上一条关于范式的评论。不过也道出了我关于范式的心声:理论毕竟是理论,结合实际开发出真正合适的系统才是最重要的。关于范式的理论需要借鉴和注意,但结合实际业务反复研究和修改更才是王道。
最后用自己的话关于范式的总结:
1NF要求要“细”,分析所有可能需求,记录详细字段;
2NF要求要“唯一”,每条记录要有唯一性,要有唯一标识;
3NF要求要“精”,选取合适的字段作为一张数据表,减少冗余;