如何在MySQL中设计消息/注释表?

时间:2011-05-30 16:55:55

标签: mysql sql database database-design

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

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 个答案:

答案 0 :(得分:1)

  1. 您无法知道哪个用户留下了哪条消息
  2. 当您使用线程实例化消息系统时,缓存两个用户ID和线程ID,不需要为每个提交运行到DB(这不是那么简单,而是为您指明方向,您将需要一些failafes mechanisems)
  3. 我会在内存中缓冲线程并仅在以后提交给DB(或者只是使用内存表)
  4. 因为这只是一个两个用户,一个只有线程的系统,你可以在一个巨大的文本字段内的一个记录中去规范化并完成整个线程,在这个记录中你将最新的条目连接到最后。同样,这只是一个方向,而不是完整的解决方案。

答案 1 :(得分:1)

你真的不需要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的回答,您应该使用一些缓存机制来提高性能。