mysql - 如何在 MySQL 中设计消息/评论表?

标签 mysql sql database database-design

我正在为社交网站在 MySQL 中设计一个消息/评论表。我有一个消息传递系统,其中参与的两个用户(只有两个且不超过两个)将具有单个/唯一线程。因此,每当一个用户向另一个用户发送消息时,它将检查两个用户是否具有唯一线程,如果没有,则它将为两个用户创建唯一线程。

create table comment_threads (
thread_id int (PK),
user_id_1 int,
user_id_2 int,
created datetime
);

create table comments (
comment_id int (PK),
thread_id int (FK),
comment text,
created datetime
);

每当一个用户每次向另一个用户发送消息时,我都必须检查两个参与用户是否都有以前的线程,所以我必须查询数据库(QUERY 1)。如果没有任何线程可在 comment_thread (QUERY 2) 中创建线程,则再次执行。然后再次在评论表(QUERY 3)中发表评论。所以我必须查询两三次消息。

问题:

  1. 上表是解决我的问题的正确方法还是需要更正?
  2. 还有其他更好的方法吗?

最佳答案

你真的不需要有 2 个表.. 1 个表应该没问题:

create table comments (
comment_id int (PK),
parent_id int,
user_id_1 int,
user_id_2 int,
comment text,
created datetime
);

对于新话题,将parent_id设置为0。对于以后的评论,您可以将parent_id设置为第一条评论的ID。

通过这种方式,您还可以进行多级线程对话,并且可以轻松执行“我已发布的评论”之类的操作。

根据 Itay 的回答,您应该使用一些缓存机制来提高性能。

关于mysql - 如何在 MySQL 中设计消息/评论表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6178888/

相关文章:

php - 连接到第二个数据库在 CodeIgniter 中不起作用

php - 无法使用 ssl 与 PDO 连接,但 mysqli 与 ssl 可以工作

mysql - SQL 合并两个语句(CROSS JOIN)

c++ - qt:对 'mysql_something@nr' 的 undefined reference

mysql - 如何在 mysql select 查询中引用上一行

mysql - 从查询中删除 'using filesort'

mysql - 如何使用 JOIN 语句进行 ORDER BY DESC?

java - 在数据库中保留动态数据以供工作流执行

mysql - 标准化 MySQL 数据库中的联系人

MySQL - 为什么几乎 2 个相同的查询会产生 2 个不同的结果?通过...分组