在数据库中存储主题标签和使用/组合的最佳方法

时间:2016-02-17 20:21:50

标签: mysql sql database performance hashtag

因此,数据库中有大量的主题标签(> 100.000)。

其他功能要求主题标签存储在由第一个字母(tags_a,tags_b,...)排序的不同表中,但我认为这个事实可以忽略并作为解决方案的一个表来处理。

我现在想要为标签的使用实现一个计数器。

所以我想我可以在这些表格中显示一个列,并在每次使用标记时计算相应的值。

那样我就必须加入表格,例如获得前100个使用过的标签......

是否有更聪明,更高性能和节省空间的方法来保存计数?

另外,我还需要存储有关使用的标签组合的信息。

例如,用户正在使用标签'#a,#e,#k,#w'我想知道#a与#e&和#a一起使用的频率#a与#k& #e用#w等等......

我想到的第一种方法是一个带有列的表:标签1(FK),标签2(FK)和计数,但这将是一个标签计数*标签计数长的表。是不是有更好的方法?

将来我想提出一些建议:

  • 您使用过#e,您可能还想使用#k。

(其中#k是与#e最受欢迎的组合之一)

或类似垃圾邮件过滤器,我检查标签之间可能/通常的关系。

如何以最高性能和节省空间的方式再次存储此类信息?

修改

我期待多达100万个帖子'每天,每个帖子最多可以有10个标签。

实际上这些不是帖子,但为了简单起见,我会这样称呼它们。

重点是,将会有一种AI实现,需要在相对较短的时间间隔内读取和学习这些和许多其他存储的数据,还要做其他事情,我们希望最小化我们尽可能多地处理和处理数据。

2 个答案:

答案 0 :(得分:2)

我将从设计数据库开始,以满足现实世界的要求。您有主题标签,这些主题标签与用户编写的某种帖子相关。这听起来像是一个用户表,一个Posts表(带有FK到用户),一个Hashtags表,以及一个带有相应FK的Posts和Hashtags之间的多对多链接表。

如果要查找主题标签的使用次数,则只需查询表格即可。除非您进入数百万(可能是数百万)数据行,否则通过适当的索引,您应该没问题。

一旦您实现了基本功能,如果测试显示(而非预感)您将遇到性能问题,那么您可以进一步优化您的需求来处理该问题。

答案 1 :(得分:1)

假设主要问题是“如何每秒冲击一百次?”

如果您有SSD驱动器,只需执行UPDATE ... SET x = x + 1 WHERE ...即可。如果没有,您将成为磁盘活动的瓶颈。 (此外,数千人可能会压倒固态硬盘。)

如果您可以使用UPDATE构建WHERE hashtag IN (the-10-or-so-hashtags),那就太好了。 (您选择将数据拆分为多个表基本上可以防止这种优化。)但是有希望 - 计数器应该在他们自己的表中,不是 in主要用户表。这是为了将计数器的高活动与其他用途分开。

因此,您需要缓冲主题标签并批量更新它们。这可能会使计数延迟一点,但这比淹没系统要好。

信息会从一个帖子进来吗?多个线程,但一个服务器?多线程?解决方案的细节取决于这些问题的答案(可能还有其他问题)。同时,请阅读my blog on high speed ingestion以获取有关我将带您的方向的一些提示。