【问题标题】:A seperate table for the posts which each user has liked - practical or not?每个用户喜欢的帖子的单独表格 - 实用与否?
【发布时间】:2017-11-20 07:31:42
【问题描述】:

在我正在制作的社交网站中,我需要某种方式来存储用户“喜欢”了哪些帖子,以确保他们只能“喜欢”每个帖子一次。我有几个想法。

  • 为每个用户创建一个单独的表,将他们喜欢的所有不同帖子的 ID 存储为所述表中的行。
  • 以空格分隔的帖子 ID 字符串作为表 users 中的字段。

  • 每个帖子都有一个单独的表,将所有喜欢该帖子的不同用户的 ID 存储为表中的行。

注意,users 是一个包含网站所有用户的表格,包括他们的 ID、用户名等。

-

最初我喜欢为每个用户创建一个单独的表格的想法,但我意识到这可能比它的价值更麻烦。

所以我认为users 中的每一行用空格分隔的字符串可能是个好主意,因为我不必开始处理更多的表(这可能会使事情复杂化),但我有一种使用的感觉与使用额外的表相比,以空格分隔的字符串会显着降低性能,尤其是在用户数量较多的情况下。

基本上我的问题是:在上述确保用户只能点赞一次帖子的方法中,哪种方法最实用?

【问题讨论】:

  • 一个表格怎么样,每行表示特定用户喜欢的特定帖子?

标签: mysql database database-design innodb social-networking


【解决方案1】:

这些听起来都不是特别好的主意。

通常,必须即时创建表,无论是为用户还是帖子,都是一个坏主意。它不仅会使您的 SQL 生成复杂化,而且还会使数据字典因大量对象而变得混乱,并使维护数据库变得比应有的复杂得多。

逗号分隔的字符串也不是一个好主意。它打破了1NF 将使您的查询复杂化(或更糟 - 让您编写正确的代码!)以维护它。

理智的方法是使用单个表来关联用户和帖子。每行将包含一个用户 ID 和他喜欢的帖子的 ID,并且在两者上创建复合主键将确保用户不能两次喜欢帖子:

CREATE TABLE user_post_likes (
    user_id INT, -- Or whatever you're using in the users tables
    post_id INT, -- Or whatever you're using in the posts tables
    PRIMARY KEY (user_id, post_id),
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (post_id) REFERENCES post(id)
);

【讨论】:

  • 这是一个很好的观点,关于必须动态创建表。谢谢!
  • 如果您需要查找(或统计)“喜欢”给定帖子的用户,您可能还需要INDEX(post_id, user_id)
  • @RickJames 定义主键应该隐式创建索引,还是我错过了你的意思?
  • 是的,PK 是唯一索引是索引。但是,我交换了两列——因为索引中列的顺序很重要。 SELECT COUNT(*) FROM likes WHERE post_id = 123 需要在某个索引中看到post_id first
  • @RickJames 好的,现在我明白你的意思了。完全同意。
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2020-09-03
相关资源
最近更新 更多