热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

商品订单表怎么设计_数据库设计之字段冗余

学过数据库设计的同学都知道,数据库设计有三大范式,但是在实际工作中,三大范式很难被严格的执行。本文将给大家介绍一种常见的、违反范式的数据库

学过数据库设计的同学都知道,数据库设计有三大范式,但是在实际工作中,三大范式很难被严格的执行。本文将给大家介绍一种常见的、违反范式的数据库设计方案——字段冗余

1 经典示例

先来看一个经典的例子,在一些商城系统里,要显示已购买的订单,一般会显示订单号、下单时间、订单金额、商品名称等,如下图。

1ca52922eb17d9c6c4efde0b6f136749.png


正常我们如果按三大范式来设计表,应该是下面这样,包含【订单表】和【商品表】,在【订单表】中用【商品ID】来关联【商品表】

d72f29b7fa16c83c776ff666e89826ad.png
404fafb6118cbefd7cd75598d7eb0d99.png


但是这样设计的话,在订单详情页面,要显示商品名称的话,就得用【订单表】+【商品表】关联查询

2 字段冗余设计

上面两张表的设计,从三大范式来说是合理的。但是在项目实际中,查看订单详情是很频繁的操作,每次操作,系统就得关联【订单表】+【商品表】查询。但其实我们只会在订单详情里显示【商品名称】这一个字段,所以我们可以在【订单表】里增加一个【商品名称】,这样我们要显示订单详情时,只需要查询【订单表】就可以了,如下:

9b9a3e9dccdfa8cb8999130402f64a23.png

3 字段冗余优缺点

缺点:
从上面的例子,我们能很直观的看出来,字段冗余有一个明显的缺点,就是【订单表】和【商品表】都存了【商品名称】,多占用了一份数据库空间,并且有多表同时更新的问题。当我们在后台修改商品名称时,要考虑订单表里的商品名称是否要一起修改。这里为什么是“考虑”,而不是一定要一起修改呢?这就要看需求了,比如我订单详情就是要显示当时购买的商品名称,而不是最新的商品名称,那么这种场景,在更新商品表时就不需要去更新订单表。

扩展:
有些时候,字段冗余不只冗余一个字段,还是订单+商品的例子,商品名称、商品价格、商品描述等,我都要保存当时的值,后续就算修改商品,也不要去修改订单里关于商品的信息,这种场景,我们就要在订单表里冗余很多商品字段,这时候,我们可以设计一张【商品快照表】保存每笔订单对应的当时的商品信息,如下:

fa4c77a57a283786f3b70293eda345e0.png

优点:
字段冗余虽然多占用了空间,但是换来的好处是简单化了数据库查询,要查看订单详情,只需要查询订单表就可以了,减轻数据库压力。简单来说,字段冗余就是用空间换取时间的一种数据库设计方案

4 什么时候使用字段冗余

只要记住一句话就可以了:查多改少的场景,适合用字段冗余。还是上面的例子:订单详情的查询很多,但是商品名称的修改很少,适合将商品名称冗余到订单表中

5 总结

数据库字段冗余是很常见的数据库设计方案,基本上我接触过的项目都不可避免的用到字段冗余设计,已经工作的小伙伴们也可以在自己的项目里找找是否有字段冗余的设计。



推荐阅读
  • 本章深入探讨了Java中的多态特性,这是面向对象编程的核心概念之一。多态指的是同一操作作用于不同的对象时,可以有不同的解释和执行方式。在Java中,多态通过父类引用变量引用子类对象来实现,即 `父类类型 引用变量名 = new 子类类型();`。这种方式允许程序在运行时根据实际对象的类型动态地选择合适的方法执行,从而提高代码的灵活性和可扩展性。此外,本章还详细介绍了多态的应用场景和注意事项,帮助读者更好地理解和运用这一重要概念。 ... [详细]
  • 将Windows Server 2003的DHCP服务迁移到Windows Server 2008 R2的最佳实践与详细步骤
    近期,我们在为某单位进行网络系统升级,从Windows Server 2003迁移至Windows Server 2008 R2的过程中,整体进展较为顺利。然而,在迁移DHCP服务时遇到了一些挑战。本文详细介绍了此次迁移的最佳实践和具体步骤,包括前期准备、环境评估、数据迁移以及后期验证等环节,旨在为同类项目提供参考和指导。 ... [详细]
  • 面部识别技术面临关键转折点:伦理与应用的平衡挑战
    面部识别技术正面临一个关键的转折点,其伦理与应用之间的平衡问题日益凸显。近日,该技术再次遭遇重大事件。本周二,由90个倡议组织组成的联盟发布了一份联合声明,呼吁全球范围内暂停使用面部识别技术,直到制定出明确的监管框架。这一举措反映了社会各界对隐私保护和技术滥用的担忧,同时也引发了关于如何在保障公共安全和维护个人隐私之间找到合理平衡的广泛讨论。 ... [详细]
  • 如何合理配置服务器系统盘容量?云服务器系统盘大小应如何选择?
    在选择云服务器系统盘容量时,需综合考虑操作系统、应用程序及未来扩展需求。对于已配置好的Linux云服务器,建议通过创建系统盘镜像来保存当前设置,以便于后续的快速部署与恢复。此外,合理的系统盘容量规划还能有效提升数据管理效率,减少不必要的存储成本。 ... [详细]
  • 优化Apache服务器默认网站目录的配置与扩展方法在Apache HTTP Server安装完成后,其默认的站点目录通常位于安装路径下的`htdocs`文件夹中,首页文件默认为该目录中的`index.html`。为了更好地管理和扩展网站内容,可以通过修改配置文件来更改默认站点目录,例如将站点根目录设置为其他位置,以便于多项目管理和资源共享。此外,还可以通过配置虚拟主机来支持多个域名和子域名,进一步提升服务器的灵活性和可维护性。 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • 在处理Java程序时,中文乱码是一个常见的问题。本文将详细探讨导致中文乱码的原因,并分享有效的解决方案,帮助开发者在实际工作中避免这一问题。通过具体的代码示例和最佳实践,本文旨在提供全面的指导,确保中文字符在不同环境下的正确显示。 ... [详细]
  • GitHub项目精讲:大型系统设计的学习资源与实践指南
    https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md 提供了一套全面的系统设计学习资源与实践指南。该项目不仅涵盖了系统设计的基本概念和原则,还详细介绍了如何构建可扩展、高性能的大型分布式系统。通过实例分析和代码示例,帮助读者深入理解系统设计的关键要素和技术实现,适合各阶段的开发者参考和学习。 ... [详细]
  • 构建和优化自定义Python模块并不复杂,因为每个Python程序本质上都是一个模块。通过合理的设计和优化,可以提高模块的可重用性和可维护性。本文将详细介绍如何创建自定义模块,并提供实用的优化技巧,帮助开发者提升代码质量和开发效率。 ... [详细]
  • 提升阅读沉浸感:精选Chrome扩展带来极致体验
    在信息爆炸的时代,提升阅读体验显得尤为重要。简悦SimpRead等精选Chrome扩展工具,不仅能够净化页面,去除干扰元素,还能通过优化排版和字体,为用户提供更加舒适、沉浸式的阅读环境,让文字内容更加赏心悦目,帮助读者更好地吸收信息。 ... [详细]
  • 综合实训 201521440015
    Chinesepeople’publicsecurityuniversity网络对抗技术实验报告实验五综合渗透学生姓名常泽远年级15区队4指导教师高见信息技术与网络安全学院2018 ... [详细]
  • 目录RPC是什么RPC的优点RPC的缺点RPC是什么RPC(RemoteProcedureCall)isaprotocolthatoneprogramcanusetorequest ... [详细]
  • 超级计算机画函数软件,致豪函数演示画板(函数图像绘制软件)V1.1.100 免费版
    致豪函数演示画板(函数图像绘制软件)是专门针对函数图像开发的一款演示和画图工具,适合中学教学辅助教育和学习,软件界面简洁,操作简单直观&# ... [详细]
  • tarzxvffilename.tar.gz顺便我们了解下linux下压缩与解压命令大全.tar解包:tarxvffilename.tar打包:tarc ... [详细]
  • Maven入门指南深入解析了Maven的核心概念与基本功能。本文详细介绍了Maven在项目构建、文档生成、报告生成、依赖管理、源代码控制(SCM)、项目发布与分发以及邮件列表管理等方面的应用。Maven通过采用标准目录结构和“约定优于配置”的原则,简化了项目的配置与管理,提高了开发效率。 ... [详细]
author-avatar
百花一枝梅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有