前言
在分表完之后显然对于数据的查询会变的比较的复杂,特别是在表的关联方面,在有些情况下根本就不能使用JOIN。
其实个人是比较鼓励将那些大的JOIN SQL拆分成几个小的SQL来查询数据。这样虽然总体的效率可能会稍稍下降(如果使用了连接池完全可以忽略),但是查询的语句变简单了,使得后续的维护带来的方便。同时也能带来比较便利的扩展。你可以感受一下有一个100行的SQL语句给你维护,和给你10个10行并且每一块都有很好的注释的SQL去维护,去帮助调优。你愿意选哪个。不管你们信不信,反正我是选第二种,而且第二种可以很好的理解业务。
上面说到要拆分JOIN,我的意思不是将每个语句都拆分。我的准则是 O(n) 次的查询。忌讳那种查出数据后通过程序循环查出结果再去数据库中查询,也就是需要 O(n*M)这种。 瞬间感觉方法论很重要有木有 ^_^。
模拟场景
场景1:购买者下订单
1、在浏览商品的时候能获得商品的 门店ID 和 商品ID,至于导购ID这里我们能以随机的形式得到(需要根据业务来确定如何获取导购ID)
2、通过导购ID获得导购的用户信息从而得到导购的数据应该放在那张分表。
3、将下单数据存入出售者的分表,和购买者的分表。
下面展示的是伪代码(因为只用SQL不好展示具体业务逻辑),其实是自己比较懒不想写Python了。^_^
-- 获得导购分表信息,和所在门店
SELECT u.table_flag AS guide_flag,
ug.store_id AS store_id
FROM user AS u, user_guide AS ug
WHERE u.user_id = ug.user_id
AND user_guide_id = 导购ID;
SET autocommit=0;
START TRANSACTION;
-- 创建销售订单 sell_order_2 通过程序拼凑出来的
INSERT INTO sell_order_2
VALUES(order_SnowflakeID, 导购ID, 购买者ID, 订单总额, 订单状态);
-- 记录此订单有哪些商品
INSERT INTO order_goods_2
VALUES(order_goods_SnowflakeID, order_SnowflakeID, 商品ID, 商品价格, 商品个数);
-- 记录购买订单表 buy_order_6 购买者所在的分表,上面的是出售者所在的分表别弄混了
-- 购买者订单ID 和 出售者订单ID是一样的
INS