第一范式(1NF)
属于第一范式关系的所有属性都不可再分,即数据项不可分。
第二范式(2NF)
必须先满足第一范式(1NF),并要求实体的属性完全依赖于主关键字
需要拆表
第三范式(3NF)
必须先满足第二范式(2NF),要求一个数据库表中不包含已在其它表中包含的非主关键字信息,即数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
需要把冗余字段去掉,不过正式使用时为了性能也会牺牲一部分空间,使用冗余字段减少表关联。
反范式化设计
一般的违反第三范式。
缓存:
比如从父表冗余一些数据到子表的。前面我们看到的分类信息放到商品表里面进行冗余存放就是典型的例子。
汇总:(报表用的比较多)
如果需要显示每个用户发了多少消息,可以每次执行一个对用户发送消息进行count的子查询来计算并显示它,也可以在user表用户中建一个消息发送数目的专门列,每当用户发新消息时更新这个值。
在使用缓存表和汇总表时,有个关键点是如何维护缓存表和汇总表中的数据,常用的有两种方式,实时维护数据和定期重建,这个取决于应用程序,不过一般来说,缓存表用实时维护数据更多点,往往在一个事务中同时更新数据本表和缓存表,汇总表则用定期重建更多,使用定时任务对汇总表进行更新。