Лучший способ хранить сообщения чата в базе данных? [закрыто]

82

Я создаю приложение для чата, и мне нужна полная история всех сообщений, когда-либо отправленных в чате. На данный момент я храню каждое сообщение в виде отдельной строки в таблице под названием «сообщения». Я знаю, что эта таблица может вырасти до огромных размеров, поскольку даже небольшие сообщения вроде «Привет» будут иметь свою собственную запись в базе данных.

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

Хотелось бы услышать ваши идеи!

Wilsonpage
источник
12
если эти сообщения не должны быть доступны для поиска или редактирования, нет смысла хранить их в базе данных
ajreal
21
Я бы посоветовал начать с легкости, думать просто, использовать реляционную базу данных, и если масштабирование станет проблемой, решите ее! Слишком много людей заботятся о сценариях, которые никогда не произойдут, потому что они тратят слишком много времени на создание идеальной инфраструктуры, и у них не будет времени сосредоточиться на том, что важно.
whirlwin

Ответы:

47

Нет ничего плохого в том, чтобы сохранить всю историю в базе данных, они подготовлены к такого рода задачам.

На самом деле вы можете найти здесь, в Stack Overflow, ссылку на пример схемы для чата: example

Если вас все еще беспокоит размер, вы можете применить некоторые оптимизации к групповым сообщениям, например, добавить буфер в ваше приложение, который вы нажимаете только через некоторое время (например, 1 минуту или около того); таким образом вы избежите только однострочных сообщений

Jasalguero
источник
15

Если вы можете избежать необходимости одновременной записи в один файл, похоже, вам не нужна база данных для хранения сообщений чата.

Просто добавьте беседу в текстовый файл (по 1 файлу на пользователя \ беседу). и иметь структуру каталогов / файлов

Вот упрощенный вид файловой структуры:

chat-1-bob.txt
        201101011029, hi
        201101011030, fine thanks.

chat-1-jen.txt
        201101011030, how are you?
        201101011035, have you spoken to bill recently?

chat-2-bob.txt
        201101021200, hi
        201101021222, about 12:22
chat-2-bill.txt
        201101021201, Hey Bob,
        201101021203, what time do you call this?

Тогда вам нужно будет сохранить только идентификатор пользователя, идентификатор разговора (guid?) И ссылку на имя файла.

Думаю, вам будет сложно получить более простое масштабируемое решение.

Вы также можете использовать LOAD_FILEдля получения данных: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Если у вас есть требование перестроить разговор, вам нужно будет указать значение (дату и время) рядом с отправленным сообщением чата (в файле), чтобы вы могли объединить и отсортировать файлы, но на данный момент это, вероятно, хорошая идея рассмотреть возможность использования базы данных.

Кевин Бертон
источник
1
Звучит великолепно. Кто-нибудь может возразить против этого аргумента?
Поездка
76
Запись в файл - ужасная идея. В большинстве серверных сред или кластеров вы даже не можете гарантировать, что ваш второй запрос даже окажется на том же сервере, что и файл. Запись в файловую систему происходит очень медленно и с ограничениями по вводу-выводу. Извините, я не могу поверить, что это набрало столько голосов.
Andy Fusniak
6
извините, я на самом деле отвечал на вопрос, не придумывая вымышленных сценариев. На данный момент сообщения сохраняются в базе данных, так почему же запись простой файловой системы будет намного медленнее. Также прочтите мой ответ по 1 файлу на каждого пользователя \ беседу !!! (в вашем вымышленном кластере я установил FSA-SAN). Требование OPs звучит как logging \ audit, на мой взгляд, которое принадлежит файлу.
Кевин Бертон
5
Запись и чтение в файл требует значительных ресурсов. Я думаю, что использование любой базы данных должно помочь сократить задержку с ресурсами. В конце концов, базы данных также хранят эту информацию в файлах (только немного по-другому). Я думаю, что данная идея является фантастической для хранения архивных чатов или чатов старше 1 года или около того. Но здесь нет ничего лучше простого db.
Джей Патель - PayPal
3
ОП ясно говорит в базе данных, помимо этой ужасной идеи, это не ответ на вопрос
Лайонел
2

Вы можете создать базу данных для x разговоров, которая содержит все сообщения этих разговоров. Это позволит вам добавлять новую базу данных (или сервер) каждый раз, когда x превышает. X - это количество разговоров, поддерживаемых вашей инфраструктурой (в зависимости от вашего оборудования, ...).

Проблема по-прежнему в том, что в одной и той же базе данных могут быть большие разговоры (с большим количеством сообщений). например, у вас есть база данных A и база данных B, каждая из которых хранит, например, 1000 разговоров. Возможно, что на сервере A гораздо больше «больших» разговоров, чем на сервере B (поскольку это контент, созданный пользователем). Вы можете добавить «главную» базу данных, которая содержит поиск, в какой базе данных / сервере можно найти отдельные разговоры (или у вас есть схема для назначения базы данных из хэша / модуля или чего-то еще).

Может быть, вы сможете найти реальные архитектуры, которые решают те же проблемы (возможно, вы не первый), и которые уже были решены.

Бернхард Кирхер
источник