Java 性能调优实战
刘超
前金山软件技术经理
59174 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
开篇词 (1讲)
模块一 · 概述 (2讲)
结束语 (1讲)
Java 性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

38 | 电商系统表设计优化案例分析

交易管理
活动管理
库存状态
活动库存
待退货库存
锁定库存
实时库存
仓区
库存管理
库存交易
订单流程
订单状态
在线购物车
离线购物车
商品SKU
商品信息管理
商品分类
使用外键关联表的建议
避免复杂的JOIN查询操作
考虑水平分表或分库
使用缓存提高并发性能
键值对代替关系数据库表存储
促销活动表设计
库存表性能瓶颈
订单表结构设计
购物车系统性能瓶颈
商品表结构设计
促销活动模块
库存模块
订单模块
购物车模块
商品模块
思考题
总结
业务难点
核心业务
电商系统表设计优化案例分析

该思维导图由 AI 生成,仅供参考

你好,我是刘超。今天我将带你一起了解下电商系统中的表设计优化。
如果在业务架构设计初期,表结构没有设计好,那么后期随着业务以及数据量的增多,系统就很容易出现瓶颈。如果表结构扩展性差,业务耦合度将会越来越高,系统的复杂度也将随之增加。这一讲我将以电商系统中的表结构设计为例,为你详讲解在设计表时,我们都需要考虑哪些因素,又是如何通过表设计来优化系统性能。

核心业务

要懂得一个电商系统的表结构设计,我们必须先得熟悉一个电商系统中都有哪些基本核心业务。这部分的内容,只要你有过网购经历,就很好理解。
一般电商系统分为平台型和自营型电商系统。平台型电商系统是指有第三方商家入驻的电商平台,第三方商家自己开设店铺来维护商品信息、库存信息、促销活动、客服售后等,典型的代表有淘宝、天猫等。而自营型电商系统则是指没有第三方商家入驻,而是公司自己运营的电商平台,常见的有京东自营、苹果商城等。
两种类型的电商系统比较明显的区别是卖家是 C 端还是 B 端,很显然,平台型电商系统的复杂度要远远高于自营型电商系统。为了更容易理解商城的业务,我们将基于自营型电商系统来讨论表结构设计优化,这里以苹果商城为例。
一个电商系统的核心业务肯定就是销售商品了,围绕销售商品,我们可以将核心业务分为以下几个主要模块:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了电商系统中表设计优化的重要性,并从核心业务和业务难点两个方面详细介绍了电商系统中的表结构设计优化。文章首先介绍了电商系统的核心业务,包括商品模块、购物车模块、订单模块、库存模块和促销活动模块。随后,针对订单表海量数据和抢购业务的性能瓶颈,提出了分表分库、缓存和分布式锁等优化方案。对于促销活动中的抢购场景,也提出了使用缓存和分布式锁来查询、更新优惠券和红包的数量的解决方案。最后,总结了在设计表时应考虑使用键值对、缓存代替数据库操作、水平分表或分库以及避免复杂的JOIN查询操作等要点。整体而言,本文通过具体的业务案例,深入浅出地介绍了电商系统中表设计的优化方法,对于需要了解电商系统表设计优化的读者来说,是一篇非常有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 性能调优实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(22)

  • 最新
  • 精选
  • -W.LI-
    外键关联,对表数据操作时,一锁锁好几张表。删除时还要做校验。影响性能

    作者回复: 对的

    2019-08-17
    51
  • 张德
    老师好 请教一个问题 以前阿里面试官就问过这么一个问题 比如在订单表中缓存了商品的名称 后来这个商品改了名字了 那我原先在订单表中的字段应该怎么处理 或者是类似的订单表中缓存的字段名称发生了改变 希望老师可以解答 谢谢

    作者回复: 订单表冗余了商品的名称,如果修改了商品名称,我们一般不会再去修改订单中的冗余数据了。 商品是有唯一标识的,商品的具体名称的修改,其实是不会影响到用户的体验,如果商品名称修改比较大,会影响到用户体验了,这个时候我们建议下架商品,上架一个新的商品。

    2019-09-01
    3
    34
  • 小橙橙
    老师,文中说的“通过大数据查询订单信息”这部分,能不能深入讲一下大数据实现的方案

    作者回复: 收到

    2019-08-20
    3
    9
  • td901105
    比较好的方式是通过一个公共表字段来存储一些具有共性的字段,创建单独的商品类型表,例如手机商品一个表、服饰商品一个表。 老师您好,请问一下这里说的是只有商品类型表还是存在一个所有的商品的表,但是只存放通用字段,比如类型、库存、价格等?

    作者回复: 对的,不通用的这些字段可以拼成json存在一个字段中,冗余在键值对数据库,也可以作为查询字段使用。

    2020-05-28
    4
  • better
    老师,以订单表为例,怎么简单理解什么叫水平分表,什么叫垂直分表呢

    作者回复: 以订单的某个列作为hash,通过hash求余或一致性哈希算法来分表,例如 数据A和数据B,水平分表后就会放到两张表中; 垂直分表则是将一张表的一些列分开到另外一张表中,例如,订单表有 订单号、付款金额、付款时间等,如果将付款金额和付款时间单独为另外一张表,这种情况就是垂直分表。

    2019-09-11
    4
  • 许童童
    外键对数据库性能有影响,比如保持数据的一致性,所以我们在程序层面保证数据的一致性,这样数据库的性能就会好很多。

    作者回复: 对的,用逻辑关联来保证各个表数据的一致性。

    2019-08-17
    3
  • 老杨同志
    使用外键,在手工处理数据时特别麻烦。update数据要求先后顺序。程序在更新数据时多了外键约束检查也影响性能

    作者回复: 是的,即麻烦又影响性能。

    2019-08-17
    3
  • 灿烂明天
    老师,你好,那逻辑上实现表的关联,具体怎么做才好呢?举个例子吧,谢谢

    作者回复: 例如,订单表和详细订单表中,如果是物理关联的情况下,是以订单表的ID关联详细订单表外键orderID。 在逻辑上关联的意思就是,在没有任何业务操作的情况下,详细订单表依然有orderID字段,只是我们不需要再物理关联订单表ID了。一旦有业务操作,我们记得在业务层将两张表的操作关联起来,例如,删除主订单,此时记得删除详细订单表。

    2019-08-23
    2
  • 小笨蛋
    有两个疑问,第一:如果把订单表以用户id维度水平分表,商家要查看他们店的所有订单情况怎么办?第二:如果商品比较多,商品也需要分表的话,用户搜索商品怎么处理?商家的要看自己店的商品怎么办?

    作者回复: 第一个疑问,商家的订单表可用冗余数据来实现,商家查看的一套数据存放在键值对数据库;第二个问题,如果商品数据量比较大,我们可将商品存放在Elasticsearch、Solr。

    2019-08-18
    1
  • 怀草诗
    老师好,请问如果一张表后期数据量会很大,那应该怎么设计呢?

    作者回复: 分表,如果考虑到后期再分表带来的数据迁移问题,考虑基于一致性哈希算法进行分表

    2020-04-22
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部