2016-11-15 95 views
0

什么是在mysql数据库中存储“喜欢”或“upvotes”的最佳方式?最有效的方式来存储像Facebook和Stackoverflow的“喜欢”

这里是我的想法是:

likes (table) 
    id (auto increment) 
    post_id 
    user_id 

,但会在likes表具有数百万甚至数十亿行的,因为每一个想后的人会插入1行,每个人都可以像不止有一次,并且有多个用户。

Facebook或stackoverflow如何管理在数据库中做到这一点?任何链接或指南表示赞赏。谢谢。

+0

太宽泛,可能会吸引舆论的答案。请就SO提出更具体的问题。 –

+0

此表中有数百万行没有内在问题。但是您可能还希望在posts表中使用非规范化的列来缓存所有投票结果的“得分”(因此您不必每次都计算)。 – MatBailie

回答

1

难道你不需要一个列进行反向投票吗?

摆脱id;相反,使用PRIMARY KEY(post_id, user_id)

通过首先让post_id,您可以有效地找到给定帖子的所有投票。同时,user_id的所有选票列表效率较低。如果你需要,那么也有INDEX(user_id)

+0

什么会摆脱'ID'做什么和主键做什么? – packnob890

+0

@ packnob890删除id列可节省1/3所需的数据存储空间。主键选项允许您说一行由两列的组合唯一标识,因此也可以强制这两列的组合唯一。 – MatBailie

+0

@packnob890 - 并且在InnoDB中,数据与PK集群。所以,一旦它查找PK,数据就在那里;没有额外的步骤。 –

0

存储用逗号分隔的用户id的字符串(或json)。 不需要额外的表格,只需将其添加为邮政专栏即可。 额外的列可以用于喜欢的总数(计数)。

+0

作为单个字段中的字符串逗号分隔的值是SQL反模式和代码异味。它违反了字段的原子性质 – MatBailie

+0

@MatBailie如果你想坚持数据库系统提供的功能,那么在更现代的数据库(比如Postgres或mariaDB)中还有一个json列(mysql也在计划这个)。如果您更深入地了解数据库中的json或csv是什么样子,您会发现两者之间没有太大的区别。在这里,超常化是反模式,imho。 – FeedTheWeb

+0

由RDBMS本机支持的JSON数据类型,数组,结构等保留强大的数据类型执行,启用索引和约束等,等等。使用字符串和任意分隔符模拟它引入了一长串潜在失败,调试困难,性能开销和维护成本。从工程角度来看,它应该是最后的手段,而不是第一选择。 – MatBailie

相关问题