学过数据库设计的学生都知道数据库设计有三种范式,但在实际工作中很难严格执行这三种范式。本文将介绍一种常见的非范式数据库设计方案-字段冗余
1 经典示例
让我们从一个经典的例子开始。在一些购物中心系统中,购买的订单通常显示订单号、订单时间、订单金额、商品名称等,如下图所示。
正常情况下,如果我们按照三个范式设计表,应该包括订单表和商品表,在订单表中使用商品ID】关联商品表
但如果这样设计,如果要在订单详情页面上显示商品名称,必须使用订单表 【商品表】相关查询
2 冗余字段设计
从三个范式来看,以上两张表的设计是合理的。但在实际项目中,检查订单细节是非常频繁的。每次操作时,系统都必须与订单表相关联 【商品表】查询。但事实上,我们只会在订单细节中显示商品名称,所以我们可以在订单表中添加商品名称,这样当我们想显示订单细节时,我们只需要查询订单表,如下:
3 冗余字段的优缺点
缺点:从上面的例子中,我们可以直观地看到,字段冗余有一个明显的缺点,即订单表和商品表都存了商品名称,占用了更多的数据库空间,同时更新了多个表。在后台修改商品名称时,应考虑订单表中的商品名称是否应一起修改。为什么这考虑而不是一起修改?这取决于需求。例如,我的订单细节是显示当时购买的商品名称,而不是最新的商品名称。在更新商品表时,无需更新订单表。
扩展:有时,字段冗余不仅仅是一个字段,还有订单 商品的例子、商品名称、商品价格、商品描述等,我必须保存当时的价值,即使以后修改商品,也不要修改订单中的商品信息,这个场景,我们必须在订单中冗余大量的商品字段,此时,我们可以设计商品快照表保存每个订单对应的商品信息,如下:
优点:虽然字段冗余占用了更多的空间,但其优点是简化了数据库查询。为了查看订单细节,您只需要查询订单表,以减轻数据库的压力。简单地说,字段冗余是一种用空间换取时间的数据库设计方案
4 何时使用字段冗余
只要记住一句话:检查更多或更少的场景,适合使用字段冗余。或者上面的例子:有很多订单细节,但很少修改商品名称,适合在订单表中冗余商品名称
5 总结
数据库字段冗余是一种非常常见的数据库设计方案。基本上,我接触过的项目不可避免地使用字段冗余设计。工作过的朋友也可以在自己的项目中找到是否有字段冗余设计。