实时聊天:直接保存在数据库或文本文件中?

时间:2010-01-14 22:37:15

标签: php mysql ajax comet chat

我将使用ajax / comet来创建聊天。我想存储聊天对话。

每个按键都会触发一个事件,该事件发送到将存储该字母的backend.php。我想知道我是否应该将它直接存储在数据库或文本文件中。

你不必考虑这个聊天架构的具体细节。只要按下的每个字母都会立即存储。

我认为如果存储在mysql中(我在彗星服务器上使用php)那么会有很多查询,每个只有一个字母。如果很多用户正在聊天,那么UPDATE和SELECT查询将是一个沉重的负担。

将对话存储在文本文件中对服务器更容易吗?打开它,附上这封信并用php关闭它。

你觉得怎么样?

3 个答案:

答案 0 :(得分:4)

问题:实时聊天:直接保存在数据库或文本文件中?

答案:如果您拥有的是随机聊天文本,那么文本文件可能就是完美的。

理由:您对此数据使用哪种可能的SQL查询?

最多可以使用grep之类的内容来扫描文件。

为什么要烦扰数据库,除非你有非常复杂的数据和许多有趣的属性?

示例:

select username,count(*) as most_active_users from chatroomxxx group by username limit 0,10;

的Python:

user_fq = collections.defaultdict( int )
for path, dirs, files in os.walk( 'path/to/chat/logs' ):
    for fn in files:
        with open( os.path.join( path, fn ), "r" ) as source:
            for line in source:
                user, timestamp, text = line.split('\t')
                user_fq[user] += 1
fq_user = collections.defaultdict( list )
for user, fq in user_fq.items():
    fq_user[fq].append( user )
top = []
for fq in sorted( fq_user, reverse=True ):
    top.extend( fq_user[fq] )
    if len(top) > 10: break

关键不在于Python和SQL一样简洁。关键是查询是从文本文件收集的相对简单的数据。

从文本文件收集简单的数据是快速的。远远快于数据库。并且基本上没有开销。

只需将行写入文件即可。使用简单脚本扫描文件。没有开销。

答案 1 :(得分:2)

我不会通过网络发送每个字母,这将不必要地产生大量的网络流量和数据库/文件写入。而是通过按发送按钮或Enter键,在用户提交消息时发送消息

存储在数据库中比文件更有意义,因为您需要能够索引数据以便快速检索。考虑您需要检索组中的数据,而不是按顺序添加到文件中。

答案 2 :(得分:1)

将有与sql操作一样多的文件操作。出于某些目的,文件可能更快,但数据库可以更好地扩展。

我很惊讶你发射每个按键 - 你知道一些用户输入的速度有多快???由于Ajax是异步的(默认情况下),您很快就会发现您的请求正在堆叠,这会延迟将消息传递给聊天伙伴,并对您的服务器造成巨大负担。

您可以在每个单词之后降级为发送,甚至可以在返回按键时降级。