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

标签 mysql database database-design innodb social-networking

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

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

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

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

-

最初,我喜欢为每个用户提供单独的表的想法,但我意识到这可能会带来更多麻烦,而不是其值(value)。

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

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

最佳答案

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

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

关于mysql - 每个用户喜欢的帖子的单独表格 - 实用与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607587/

相关文章:

Mysql - 从前一天的输入中减去值

mysql - 同时插入两个

database - 如何使用 Selenium 进行数据库测试?

database - 拆分mysql转储文件并将拆分文件保存在另一台服务器上?

php - 存储具有不同关键字的推文。单个大表,还是每个关键字一个表?

mysql - 如何确定哪些值与上个月 SQL 相比发生了状态更改

java - Spring Security 找不到数据源

mysql - 如何判断我的表是什么范式

mysql - "Invalid Default Value"mssql 到 MySql 迁移工具

sql - 在多用户 sql 数据库中保存用户所做的更改