聊天室的数据库设计。需要保存每个聊天

时间:2011-09-14 09:38:25

标签: mysql database-design

方案: 为各种用户设计一个聊天室,一次聊天。所有的聊天都需要保存。每当用户登录时,他应该能够看到之前的所有聊天记录。

以下是可用于存储聊天记录的表的一个示例:

CREATE TABLE chat 
(
  chat_id int NOT NULL auto_increment,
  posted_on datetime NOT NULL,
  userid int NOT NULL,
  message text NOT NULL,
  PRIMARY KEY (chat_id),
  FOREIGN KEY(userid) references users(userid) on update cascade on delete cascade
);

为了按正确的顺序检索聊天,我需要在表中存储聊天记录的主键。所以,如果我使用上面的表来存储聊天,那么我就不能存储超过2147483647个聊天记录。显然,我可以使用一些像unsigned bigint这样具有巨大范围的数据类型,但它仍然会有一些限制。

但是,由于场景说要保存的聊天内容可以是无限的,那么我应该制作什么样的表?我应该制作一些其他主键吗?

请帮我整理解决方案。我想知道Google或Facebook如何设法保存每次聊天。

1 个答案:

答案 0 :(得分:0)

如果您没有使用MySQL,那么用户ID的主键和时间戳可能会正常工作。但MySQL的时间戳只能解析为一秒钟。 (请参阅下文,了解影响此答案的最新变化。)有几种方法可以解决这个问题。

  • 让应用程序代码通过等待a来处理主键冲突 第二,然后重新提交。
  • 让应用程序代码提供更高精度的时间戳,并存储 它是一个可排序的CHAR(n),如'2011-01-01 03:45:46.987'。
  • 切换到支持微秒时间戳的dbms。

如果您打算编写一个显示按时间戳排序的行的查询,那么所有应用程序代码都需要是服务器端代码。

<强>后来

当前版本的MySQL支持fractional seconds in timestamps