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

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

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

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

3 ответов


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

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

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


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

просто добавьте разговор в текстовый файл (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

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


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

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

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