数据库表范式-mysql

数据库表设计

前言:

​ 王珊教授 - 《数据库系统概论》

​ 范式 - 表结构设计标准的级别

​ 常规范式: 1NF , 2NF , 3NF, BCNF, 4NF, 5NF

​ 意义: 为了消除重复数据,减少冗余数据,让我们数据表有更好的组织关系

​ 特点: 符合高级范式的设计,必定符合其低级的范式设计;

第一范式

1NF: 字段是最小单元 且 不可再分

错:

| id | 联系人 | 联系地址 |

| ---- | ------ | ------------------------------------ |

| 1 | 周轩 | 西伯利亚 12345678910 |

有点对:

| id | 联系人 | 联系人电话 | 联系人地址 |

| ---- | ------ | ---------- | ------------------------ |

| 1 | 周轩 | 12345678910 | 西伯利亚 |

非常对:

| id | 联系人 | 联系人电话 | 省 | 市 | 区 | 地址 |

| ---- | ------ | ---------- | ---- | ---- | ------ | ------------ |

| 1 | 周轩 | 112345678910 | 西伯利亚 | 西伯利亚 | 西伯利亚 | 西伯利亚33号 |

疑问? 仅仅符合第一范式, 是否就可以了?

| 商品id | 商品名称 | 分类号 | 分类名 | 价格 | 仓库 | 仓库负责人 |

| ------ | -------- | ------ | ------ | ---- | ---- | ---------- |

| 1 | 茜茜6代 | 1 | 双肩 | 100 | A | 周轩 |

| 1 | 茜茜6代 | 2 | 单肩 | 80 | A | 周轩 |周轩 |

更新异常: 将茜茜6代 改名为 茜茜限量版, 工作人员要改两次

插入异常: 设计部出了 茜茜7代,但是市场部还没定价,插入第三条 ‘脏数据’

第二范式

2NF : 满足1NF , 表中字段必须完全依赖于 全部主键 而非部分主键

上表中 主键【商品id&品类号】

案例: 如果只想获得分类名, 已知分类号即可, 即产生了部分依赖

表1 商品表

| 商品id | 商品名称 | 仓库 | 仓库负责人 |

| ------ | -------- | ---- | ---------- |

| 1 | 茜茜6代 | A | 周轩|

表2 分类表

| 分类id | 分类名 |

| ------ | ------ |

| 1 | 双肩 |

| 2 | 单肩 |

表3 定价表

| 商品id | 分类id | 定价 |

| ------ | ------ | ---- |

| 1 | 1 | 100 |

| | 2 | 80 |

疑问: 符合2NF之后,还会不会有问题

第三范式

3NF:满足2NF, 非主键外得所有字段必须互不依赖,即非主键字段不能有传递性依赖

商品id -> 商品名称 ->仓库->仓库负责人

仓库 - > 仓库负责人

1,商品表

| 商品id | 商品名 | 仓库 |

| ------ | ------- | ---- |

| 1 | 茜茜6代 | B |

2,仓库表

| 仓库ID | 负责人 |

| ------ | ------ |

| A | 周轩 |

| B | 阿泽 |

反范式

定义:一定程度上的违反范式,可以带来有效收益

场景1, 规避复杂的聚合操作,提高统计效率

疑问1:统计一下 每个分类的总销量;

​ 1,方案1 定价表设置销量字段,聚合统计每款分类的总销量 - 聚合

​ 2,方案2 总分类表上,设置总销量字段,每卖出一款,对应+1 - 无需聚合 - 增加一定字段上的冗余更优

场景2, 一定程度上的数据冗余,便于还原数据的真实性

疑问1: 订单表中的地址,该如何存

表1 地址表

| id | 联系人 | 联系人电话 | 省 | 市 | 区 | 地址 |

| ---- | ------ | ---------- | ---- | ---- | ------ | ------------ |

| 1 | 周轩 | 112345678910 | 西伯利亚 | 西伯利亚 | 西伯利亚 | 西伯利亚33号 |

表2 订单表

| 订单id | 订单商品 | 地址id |

| ------ | -------- | ------ |

| 1 | 茜茜6代 | 1 |

场景: 我于2020年2月14日 买了一款 茜茜6代 双肩款 寄到了 西伯利亚 西伯利亚33号

我于2020年2月15日 在西伯利亚收货

我于2020年3月15日,将我的地址1 从 西伯利亚修改到了天津

请问: 我现在去查 2月14日下的订单【茜茜6代】,该订单收获地址是哪里 -> 天津

| 订单id | 订单商品 | 省 | 市 | 区 | 地址 | 联系人 |

| ------ | -------- | ---- | ---- | ---- | ---- | ------ |

| | | | | | | |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值