Home Tags Posts tagged with "联表查询"

联表查询

0 27

今天在分析需求的时候,rock哥突然叫我过去,跟我讨论一个需求的建表方案。

 

我和rock负责的这个需求是对一个运营人员(BD)所拥有的门店数据的统计展示。首先我们设计了权限管理,每个BD拥有查看对应门店统计数据的权限,对应到库表是:t_BDRelatedShop_info

即 运营人员的ID和其所拥有权限的门店ID相对应;而另一张表,则是 门店统计数据表:t_shopStatistics_info

按道理来说,要展示一个BD所拥有权限的门店的统计数据,仅仅涉及到三个部分,即 Uid,ShopId,ShopStatisticsInfo,我们完全可以把这三个部分整合到一张表里,这样进行单表查询,效率最高,结构最简单,那为什么还要分两张表呢?

Rock哥告诉我,分表主要有两方面的考虑

架构层面:前文提到 t_BDRelatedShop_info 这个表是用来做权限管理的,也就是说,这个表应该是独立的;如果把 Uid,ShopId,ShopStatisticsInfo 这三部分信息冗余到一张表里,那么是                         不利于系统维护和调整的;

业务层面:1.我们现有的权限审批系统采用的是 T+1 模式,简单来说就是 如果当前BD想要修改权限,比如新增一个可以查看的门店,这个BD提交的权限申请要等到第二天才能生效;

                     2.我们现有的业务表和数据表是分开存放的,出于数据量和安全考虑

        分表之后我们需要先从t_BDRelatedShop_info表中查出BD所拥有的门店统计数据权限的ShopIdList,然后通过ShopIdList再去t_shopStatistics_info表中查出每一个门店所对应的统计信              息,组成列表ShopStatisticsList返回;很显然,分两张表虽然可以解决上述问题,但是在性能上是有损耗的,因为要进行两次查表。

 

联表查询

这个时候有朋友会说,你傻啊,你不会做联表查询吗?

是的,我考虑过,可是Rock哥告诉我,如果建两张表,那么这两张表并不在一个库之中,MySQL的跨库Join查询做的并不怎么好,尤其是一旦BD和门店的数量一上去,Join查询的性能就更加糟糕;

 

双写实现

既然MySQL的跨库Join查询效率不高,那么我们将其改成MySQL的同库Join不就好了吗?

t_BDRelatedShop_info 权限管理表的数量级并不算大,我们可以采用双写的方式实现

即 在t_BDRelatedShop_info表所在的库中也建一个t_shopStatistics_infoB表,作为t_shopStatistics_infoA表的从表,每一次对t_shopStatistics_infoA表的操作都同步到t_shopStatistics_infoB表中,这样可以保证实时同步BD的权限;

BD申请修改权限——>t_shopStatistics_infoA表修改——>同步到t_shopStatistics_infoB表

BD申请查看门店数据统计——>t_shopStatistics_infoB表Join t_shopStatistics_info表

 

至此,该问题暂时被解决了,而这个问题让我了解了很多新东西

  1. 跨库查询和分库分表 分库分表的几种常见玩法及如何解决跨库查询等问题-阿里云开发者社区 (aliyun.com)
  2. 单个数据库实例所能承载的数据量
  3. 联表查询