2011-09-14 125 views
5

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

下面是表的一个例子,可用于存储聊天:

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

bigint有什么问题?这给你的范围高达9223372036854775807独特的情况。如果你每天有10亿次聊天,那么在你超过这个范围之前需要90亿年的时间。 – selbie

+0

但我认为有一张大桌子是一个perforance缺点。 – Paddy

+0

@selbie有人告诉我,当表变得太大时,只需将表中的数据转储到文件中,并清空表,并在需要该数据时,只需将文件中的数据加载到表中即可。这就是Google或fb如何保存无限数据。但是我不知道这是否是正确的soln,或者如果它是正确的,那么究竟该如何实现它。 – Paddy

回答

0

如果你不使用MySQL,用户ID和时间戳的主键可能会正常工作。但是MySQL的时间戳只能解析为一秒钟。 (请参阅下面有关影响此答案的最新更改。)有几种方法可以解决此问题。

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

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

后来

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

+0

MariaDB 5.3(仍处于测试阶段)在datetime和timestamp类型中支持微秒:http://kb.askmonty.org/en/microseconds-in-mariadb –

+0

使用非顺序值(如用户标识)启动密钥会导致数据随机插入桌子的不同位置。最好将新数据顺序添加到表格末尾。特别有助于索引。 –