每个用户喜欢的帖子的单独表格 - 实用与否?

时间:2017-06-17 17:46:25

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

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

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

  • 每个帖子的单独表格,存储所有不同的用户'喜欢所说帖子的ID为表格中的行。

注意,users是一个包含所有网站用户及其ID,用户名等的表格。

-

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

所以我认为users中每行的空格分隔字符串可能是一个好主意,因为我不必开始处理更多表格(这可能会使事情复杂化),但我感觉使用空格分隔的字符串会比使用其他表格更显着地降低性能,特别是对于更多用户而言。

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

1 个答案:

答案 0 :(得分:2)

这些听起来都不是特别好的想法。

通常,必须动态创建表,无论是用户还是帖子,都是个坏主意。它不仅会使您的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)
);