反范式化设计:
- 是针对范式化而言得,在前面介绍了数据库设计的范式;
- 所谓得反范式化就是为了性能和读取效率得考虑而适当得对数据库设计范式的要求进行违反;
- 允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间。
商品分类信息:
反例:
商品信息:
ID | 商品名称 | 出版社名称 | 图书价格 | 图书表述 | 作者 |
---|---|---|---|---|---|
分类信息:
分类名称 | 分类描述 |
---|---|
商品分类对应关系表:
商品名称 | 分类名称 |
---|---|
正例:
商品信息:
ID | 商品名称 | 分类名称 | 出版社名称 | 图书价格 | 图书表述 | 作者 |
---|---|---|---|---|---|---|
分类信息:
分类名称 | 分类描述 |
---|---|
订单信息:
反例:
订单表:
订单编号 | 下单用户名 | 下单日期 | 支付金额 | 物流单号 |
---|---|---|---|---|
订单商品关联表:
订单编号 | 订单商品分类 | 订单商品名 | 订单商品数量 |
---|---|---|---|
订单编号 | 商品分类ID | 订单商品数量 |
---|---|---|
正例:
订单表:
订单编号 | 下单用户名 | 手机号 | 下单日期 | 支付金额 | 物流单号 | 订单金额 |
---|---|---|---|---|---|---|
订单商品关联表:
订单编号 | 订单商品分类 | 订单商品名 | 订单单价 | 订单商品数量 |
---|---|---|---|---|
编写SQL查询出每一个用户的订单总金额:
SELECT
下单用户名,
sum(订单金额)
FROM
订单表
GROUP BY
下单用户名;
编写SQL查询出下单用户和订单详情:
SELECT
a.订单编号,
a.用户名,
a.手机号,
b.商品名称,
b.商品单价,
b.商品数量
FROM
订单表 a
JOIN 订单商品关联表 b ON a.订单编号 = b.订单编号
总结:不能完全按照范式得要求进行设计,要考虑以后如何使用表。
反范式化设计优缺点:
优点:
- 可以减少表的关联;
- 可以更好的进行索引优化。
缺点:
- 存在数据冗余及数据维护异常;
- 对数据的修改需要更多的成本。