MySQL三范式&逆范式
2018-09-19 本文已影响4人
老衲灬
一、三范式
概念:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则(注:在关系型数据库中这种规则就称为范式)
1、确保每列/字段保持原子性(1NF)
概念:指每个字段不可以再拆分
案例:地区表
id(编号) address(地址) #可以拆分:省 市 区
1 北京北京朝阳区
2 上海上海浦东新区
3 江苏泰州海陵区
2、有主键,非主键字段依赖主键(2NF)
概念:指每个表有一个主键,一个表只描述一件事
案例:用户表
id(编号) username(用户名) password(密码) address(收货地址)
#说明:应该新增收货地址表
3、消除传递依赖,非主键字段不能相互依赖(3NF)
概念:一个表不能包含其他表的非主键字段(一个表只能包含其他包的主键字段)
案例:
#文章表
文章编号 文章标题 文章内容 用户ID #用户姓名(不该有)
文章表主键 文章表 文章表 用户表主键 #用户表非主键
#用户表
用户ID 用户姓名 用户年龄 ...
二、逆范式
概念:符合范式设计是为了减少冗余提高读写效率,但有时候我们需要反其道而为之,利用空间来换时间(数据冗余策略),该设计被称之为“逆范式”
案例:
#文章表
编号 标题 内容 评论总数...
#评论表
编号 所属用户 所属文章 评论内容 ....
正常流: select count(*) from 评论表 where id=当前文章的编号
逆范式: 给文章表加一个“评论总数字段”
后期评论时候给该字段+1
设计表推荐如下字段:编号、创建日期、更新日期、是否删除