(6)大表优化-电商系统订单分表方案(4)
电商系统订单分表方案怎么设计更好
题目背景:
之前做电商运营,打算转行做开发,参加了几个面试,几乎每家都会问到大数据量时的解决方案。暂时不讨论问这个题目的合理性,既然有需求,那自己就加强吧。所以基于目前个人做的一个系统,计划向大数据量做扩展设计。
涉及的业务场景:
(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%表数量