MysqlSSM+shiro等javaweb收藏

(6)大表优化-电商系统订单分表方案(4)

2018-07-31  本文已影响337人  hedgehog1112

电商系统订单分表方案怎么设计更好

题目背景:

之前做电商运营,打算转行做开发,参加了几个面试,几乎每家都会问到大数据量时的解决方案。暂时不讨论问这个题目的合理性,既然有需求,那自己就加强吧。所以基于目前个人做的一个系统,计划向大数据量做扩展设计。

涉及的业务场景:

(1)市场中有多个卖家(seller),可查看、处理包含该卖家商品的订单(order)

(2)买家(user)可查看跟踪自己的订单

订单表设计方案及查询时处理逻辑

方案1(初始方案)

(1) 原始订单表按照买家id取模分表

(2) 新建买家与订单的映射关系表(也会数据量很大,可再按orderID取模分表)

查询处理逻辑:

1买家查询自己所有的订单:按照userId取模找到对应的订单分表,取数据

2买家按照订单号查询订单:根据orderId从买家订单映射中获得userId,然后仍然是按照userID取模找到对应的订单分表

问题:这样拆分后,与卖家有关的订单就被拆在多张表中,卖家查看自己的订单时还是要扫描所有数据

方案2(修改方案1)

对原始订单也按照卖家id取模分表,然后再建立卖家与订单的映射关系

问题:该方案虽然能实现设定的业务逻辑,但订单数据要保存两份,要维护两个映射表

方案3(修改方案2)

学习了淘宝的订单系统设计,将订单拆分为买家库、卖家库,消息中间件进行订单同步(类似于方案1、2的对买家、卖家分表么),似乎是不关注订单数据冗余,但没想明白如何按照订单查询,所以借鉴设计了方案3:

(1)按照userId取模分表

(2)按照sellerId取模分表

(3)按照orderId取模分表

相比方案1、2,少维护了一张表,但有两份数据冗余

ps:id取模分表?

场景:假设按用户id分2个库 每个库分10张表

分表策略

1.用户id%2 确定库  用户id%3确定表。

2.(用户id%(2*10))/ 10  取整确定库,(用户id%(2*10)%10确定表。

2为最优秀方案连续存储。

tempvar=user_id%(库数量*表数量)

库=tempvar/表数量

表=tempvar%表数量

上一篇下一篇

猜你喜欢

热点阅读