表的设计模式
表关系
- 一对一
- 一对多
- 多对一
- 多对多
第一范式(1NF)
- 需要保证原子性即数据列一对一
用户id 姓名 性别 年龄 联系方式 家庭住址 张三 男 18 tel:13888888888 qq 123456 家庭住址:dfdsaf
第一范式
用户id 姓名 性别 年龄 手机 qq 省份 市区 县 # 直到每个列不能继续拆分为止
第二范式(2NF)
- 在第一范式的基础上要求所有列必须和主键有关系 消除补分依赖
商品id 商品名称 价格 商品详情 重量 有效期 分类 分类描述 # 分类描述 并不依赖于主键 需要拆分
存在问题:
数据冗余 : 每条记录含有相同的信息
删除异常: 删除分类描述 把商品也删掉了
插入异常: 不知道分类 商品没法保存
更新异常: 更新分类信息 所有的商品信息都得更新
拆分以后:
商品id 商品名称 价格 重量 商品详情 有效期 分类id # 一个商品只属于一个分类的 情况 一个分类里边有多个商品
分类id 分类名称 分类描述
第三范式(3NF)
- 3NF 满足第二范式基础上 消除传递依赖 多对多
商品名称 价格 商品详情 重量 有效期 分类 分类描述 分类描述并不依赖于主键
分类id 分类名称 分类描述
分类id 商品id
2 1
3 1
反范式
- 牺牲空间换区搜索时间的提升
在商品表上多加一个字段 总价 总价等于单价乘以数量 好处是 一张表就可以得到结果 坏处是 冗余