今天刚好碰到类似的问题。因为我们需要做一个有关消息 发布的东西。有消息发布肯定需要有回复,转载。这就形成了一对多,多对多。
但是如此大量的数据,需要如何记录并且快速的查询。我参考了下其他文章。可以用tid(帖子id)切分法,也可以用uid(userid)切分法,基因法。
tid切分法:由于数据两特别大,我们需要分库去处理。 这里就可以按照tid分库,同一个用户发布的帖子落在不同的库上,但是通过uid查询的时候就需要遍历所有的库。
uid切分法:可以解决上面的的问题。就是给uid和tidz建立一个映射关系表。这样用uid查询的时候可以指定到某个库。 用tid查询的时候可以先去查询关系表。查到对应的uid,也就可以指定到某个库上。但是还是需要先遍历下 关系表。有没有可以不用查询关系表,用两种都可以指定到库的方法。下面这种就可以。
基因法:按照uid分库,在生成的tid里加上uid上的分库基因。这样就可以tid和uid都可以定位到库上。
分库基因:可以用uid%分库的个数 , 决定这行数据要插入到哪个库中。而分库基因就是把uid转换成二进制, 取最 后几位(这里取的位数需要提前根据数据的增长来设计。可以去4位,也可以是8位),例如:888 二进制 是 1101111000 取后4位。作为分库基因,生成tid的时候可以通过算法,生成前60bit。 再拼接上分库基因 拼装 成最终的64位bit的tid。(这里可以参考 分布式ID生成算法),这样通过uid%16可以定位到库tid%16 也可以定位到库。因为同一个用户发的帖子的tid的最后四位都是相同的,而且都落在同一个库上。
这里有个潜在问题就是开始分好的库过了几年要扩充库,分库基因就需要变怎么办?
需要提前做容量预估,提前预留分库基因。