原则,首先满足1nf,2nf才能满足,其次3nf。如果1nf都不满足,2nf,3nf也不能满足了。
①1nf列具有原子性不可分割(如果是关系型数据库就满足一范式)不像mongoDB那样一个列是个集合就ok。
关系型数据库:mysql/oracle/db2/infomix/sysbase/sql server
非关系:mongoDB
②表中记录是唯一的
设置主键进行区分 主键不含业务逻辑、一般递增
③表中不要有冗余数据
如果一个表中的数据可以通过外键关联可以查询到,就不应该单独存放
例如:
user表
id | name | classid | clasname |
1 | aa | 1 | bb |
2 | cc | 1 | dd |
班级表
classid | clasname | classNum |
1 | bb | 302 |
2 | ff | 303 |
如上表,user表中的classname可以直接通过classid关联在班级表中查询到,所以这里算是冗余数据
④反3nf
一些特殊的情况,为了效率着想,3nf不成立
比如
相册表
id | photoid | views(所有照片的总浏览) |
photoid | name | views(单个照片的浏览) |
如上,views出现了冗余,因为它可以通过photoid可以进行查询到,但是如果查询,需要进行的操作是,先将相册全部查询出来,然后在到照片表里查询每张照片的views
然后进行相加计算,这样效率就不会变快,如果在相册表中添加了views字段,效率会更加的快。
所以一些情况还是需要特别的对待。