Najlepszy sposób na przechowywanie wiadomości czatu w bazie danych? [zamknięte]

Buduję aplikację do czatu i chcę mieć pełną historię wszystkich wiadomości kiedykolwiek wysłanych w rozmowie na czacie. W tej chwili przechowuję każdą wiadomość jako pojedynczy wiersz w tabeli o nazwie 'messages'. Zdaję sobie sprawę, że ta tabela może rosnąć ogromny, jak nawet małe wiadomości, takie jak " Hi " będzie miał swój własny rekord bazy danych.

Czy ktoś może polecić bardziej skalowalne rozwiązanie mysql? Nie wymagam, aby poszczególne wiadomości były przeszukiwalne, edytowalne lub usuwalne. Czy cała rozmowa może być zapisana w jedno wielkie pole?

Chciałbym usłyszeć twoje pomysły!

Author: wilsonpage, 2011-08-15

3 answers

Nie ma nic złego w zapisywaniu całej historii w bazie danych, są przygotowani do tego typu zadań.

W rzeczywistości można znaleźć tutaj w Stack Overflow link do przykładowego schematu dla czatu: Przykład

Jeśli nadal martwisz się o rozmiar, możesz zastosować pewne optymalizacje do wiadomości grupowych, na przykład dodanie bufora do aplikacji, który naciskasz dopiero po pewnym czasie (około 1 minuty); w ten sposób unikniesz tylko wiadomości z 1 linii

 32
Author: jasalguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:33

Jeśli można uniknąć konieczności jednoczesnego zapisu do jednego pliku, wygląda na to, że nie potrzebujesz bazy danych do przechowywania wiadomości czatu.

Po prostu dołącz konwersację do pliku tekstowego(1 plik na użytkownika\konwersacja). i mieć strukturę katalogu / pliku

Oto uproszczony widok struktury plików:

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?

Wtedy wystarczy zapisać userid, conversation id (guid ?) & odniesienie do nazwy pliku.

Myślę, że będzie Ci trudno dostać prostsze skalowalne rozwiązanie.

Możesz użyć LOAD_FILE Aby uzyskać dane zobacz: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Jeśli masz wymagania, aby odbudować rozmowę, musisz umieścić wartość (datę i godzinę) obok wysłanej wiadomości czatu (w pliku), aby umożliwić scalanie i sortowanie plików, ale w tym momencie prawdopodobnie warto rozważyć użycie bazy danych.

 19
Author: Kevin Burton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-28 07:55:12

Możesz utworzyć bazę danych dla X rozmów, która zawiera wszystkie wiadomości z tych rozmów. Pozwala to na dodawanie nowej bazy danych (lub serwera) za każdym razem, gdy x przekracza. X to liczba rozmów, które obsługuje twoja infrastruktura (w zależności od sprzętu,...).

Problem nadal polega na tym, że w tej samej bazie danych mogą być duże rozmowy (z dużą ilością wiadomości). np. masz bazę danych A i bazę danych b an każdy przechowuje np. 1000 rozmów. Możliwe, że na serwerze A jest znacznie więcej "dużych" rozmów niż na serwerze B (ponieważ jest to treść tworzona przez użytkownika). Możesz dodać bazę danych "master", która zawiera odnośnik, na której bazie danych / serwerze można znaleźć pojedyncze rozmowy (lub masz schemat przypisania bazy danych z hash/modulo lub coś takiego).

Być może uda Ci się znaleźć prawdziwe architektury świata, które borykają się z tymi samymi problemami (może nie jesteś pierwszy), i które już zostały rozwiązane.

 1
Author: Bernhard Kircher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-15 08:55:21