живой чат: сохранение непосредственно в базе данных или текстовом файле? - PullRequest
1 голос
/ 15 января 2010

Я собираюсь использовать ajax / comet для создания чата. и я хочу сохранить разговор в чате.

каждое нажатие клавиши будет вызывать событие, которое отправляется в backend.php, в котором будет храниться письмо. Интересно, стоит ли хранить его непосредственно в базе данных или в текстовом файле.

вам не нужно учитывать детали того, какой именно будет архитектура этого чата. просто каждая нажатая буква будет сохранена немедленно.

Я подумал, что если хранить в mysql (я использую php на комет-сервере), то будет много запросов, только по одной букве каждый. и если многие пользователи общаются, то это будет большая нагрузка с запросами UPDATE и SELECT.

Будет ли проще хранить разговор в текстовых файлах для сервера? просто откройте его, добавьте письмо и закройте его с помощью php.

что ты думаешь?

Ответы [ 3 ]

4 голосов
/ 15 января 2010

Вопрос: чат: сохранение непосредственно в базе данных или текстовом файле?

Ответ: Если все, что у вас есть, это произвольный текст чата, текстовый файл, вероятно, идеально подходит.

Обоснование: Какой возможный 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. Дело в том, что запрос является относительно простым сбором данных из текстовых файлов.

И простой сбор данных из текстовых файлов БЫСТРО. Гораздо быстрее, чем база данных. И с практически нулевыми накладными расходами.

Просто напишите строки в файлы. Сканируйте файлы с помощью простых скриптов. Нет накладных расходов.

2 голосов
/ 15 января 2010

Я бы не отправлял каждое письмо по сети , это без необходимости будет генерировать большой объем сетевого трафика и записи в базу данных / файл. Вместо этого отправьте сообщение, когда пользователь подтвердил его , нажав кнопку Отправить или клавишу Enter.

Хранение в базе данных имеет гораздо больший смысл, чем файл, так как вам нужно будет индексировать данные для быстрого поиска. Учтите, что вам нужно будет получать данные в группах, а не так, как они были последовательно добавлены в файл.

1 голос
/ 15 января 2010

Файловых операций будет столько же, сколько и SQL-операций. Файлы могут быть быстрее для некоторых целей, но базы данных будут масштабироваться намного лучше.

Я удивлен, что вы запускаете каждое нажатие клавиши - вы знаете, как быстро некоторые пользователи набирают ??? Поскольку Ajax является асинхронным (по умолчанию), вы быстро обнаружите, что ваши запросы складываются, и это задержит доставку сообщения партнеру по чату, а также создаст огромную нагрузку на ваш сервер.

Вы можете перейти на отправку после каждого слова или даже после нажатия клавиши возврата.

...