每个按键都会触发一个事件,该事件发送到将存储该字母的backend.php。我想知道我是否应该将它直接存储在数据库或文本文件中。
你不必考虑这个聊天架构的具体细节。只要按下的每个字母都会立即存储。
我认为如果存储在mysql中(我在彗星服务器上使用php)那么会有很多查询,每个只有一个字母。如果很多用户正在聊天,那么UPDATE和SELECT查询将是一个沉重的负担。
将对话存储在文本文件中对服务器更容易吗?打开它,附上这封信并用php关闭它。
你觉得怎么样?答案 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是异步的(默认情况下),您很快就会发现您的请求正在堆叠,这会延迟将消息传递给聊天伙伴,并对您的服务器造成巨大负担。
您可以在每个单词之后降级为发送,甚至可以在返回按键时降级。