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

82

Tworzę 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 zwanej „wiadomościami”. Zdaję sobie sprawę, że ta tabela może się rozrosnąć, ponieważ nawet małe wiadomości, takie jak „Cześć”, miałyby swój własny rekord bazy danych.

Czy ktoś może polecić bardziej skalowalne rozwiązanie mysql? Nie wymagam, aby poszczególne wiadomości można było przeszukiwać, edytować lub usuwać. Czy cała rozmowa mogłaby być przechowywana w jednym ogromnym polu?

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

wilsonpage
źródło
12
jeśli te wiadomości nie wymagają możliwości wyszukiwania ani edytowania, nie ma sensu ich przechowywać w bazie danych
ajreal
21
Radziłbym zacząć łatwo, myśleć prosto, korzystać z relacyjnej bazy danych, a jeśli skalowanie stanie się problemem, zajmij się nim! Zbyt wielu osobom zależy na scenariuszach, które nigdy się nie pojawią, ponieważ spędzają zbyt dużo czasu na budowaniu idealnej infrastruktury i nie będą mieli czasu na skupienie się na tym, co ważne.
whirlwin

Odpowiedzi:

47

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

Właściwie możesz znaleźć tutaj w Stack Overflow link do przykładowego schematu czatu: przykład

Jeśli nadal martwisz się rozmiarem, możesz zastosować pewne optymalizacje do wiadomości grupowych, takie jak dodanie bufora do aplikacji, który wsuwasz dopiero po pewnym czasie (np. 1 minuta); w ten sposób unikniesz posiadania tylko jednej wiadomości liniowej

jasalguero
źródło
15

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

Wystarczy dołączyć konwersację do pliku tekstowego (1 plik na użytkownika \ konwersację). i mają strukturę katalogów / plików

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łoby tylko zapisać identyfikator użytkownika, identyfikator konwersacji (guid?) I odniesienie do nazwy pliku.

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

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

Jeśli chcesz odbudować konwersację, będziesz musiał 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 jest to dobry pomysł rozważyć użycie bazy danych.

Kevin Burton
źródło
1
Brzmi świetnie. Czy ktoś może odpierać ten argument?
Wycieczka
75
Zapisywanie do pliku to okropny pomysł. W większości środowisk lub klastrów po stronie serwera nie można nawet zagwarantować, że drugie żądanie trafi nawet na ten sam serwer, co plik. Zapisywanie systemu plików jest bardzo powolne i ograniczone we / wy. Przepraszam, nie mogę uwierzyć, że zebrało to tyle głosów pozytywnych.
Andy Fusniak
6
przepraszam, że faktycznie odpowiadałem na pytanie, nie wymyślając fikcyjnych scenariuszy. W tej chwili komunikaty są utrwalane w bazie danych, więc dlaczego zapis w prostym systemie plików miałby być znacznie wolniejszy. Przeczytaj również moją odpowiedź 1 plik na użytkownika \ konwersację !!! (na twoim fikcyjnym klastrze zainstalowałem FSA-SAN) .Wymaganie OP brzmi jak logowanie \ audyt, moim zdaniem, które należy do pliku.
Kevin Burton
5
Zapisywanie i odczytywanie pliku wymaga dużej ilości zasobów. Uważam, że korzystanie z jakiejkolwiek bazy danych powinno pomóc w zmniejszeniu opóźnienia zasobów. Pod koniec dnia bazy danych również przechowują te informacje w pliku (tylko trochę inaczej). Myślę, że dany pomysł jest fantastyczny do przechowywania zarchiwizowanych czatów lub czatów starszych niż 1 rok. Ale tutaj nic nie przebije prostego db.
Jay Patel - PayPal
3
OP wyraźnie mówi w bazie danych, poza tym okropnym pomysłem, to nie odpowiada na pytanie
Lyoneel
2

Możesz utworzyć bazę danych dla x rozmów, która zawiera wszystkie wiadomości z tych rozmów. Umożliwiłoby to dodanie nowej bazy danych (lub serwera) za każdym razem, gdy x przekracza. X to liczba rozmów obsługiwanych przez twoją infrastrukturę (w zależności od sprzętu, ...).

Problem w dalszym ciągu 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 i każda z nich przechowuje np. 1000 rozmów. Możliwe, że na serwerze A jest znacznie więcej „dużych” konwersacji niż na serwerze B (ponieważ jest to treść tworzona przez użytkowników). Możesz dodać "główną" bazę danych, która zawiera wyszukiwanie, w której bazie danych / serwerze można znaleźć pojedyncze konwersacje (lub masz schemat przypisywania bazy danych z hash / modulo lub coś w tym rodzaju).

Może znajdziesz architektury świata rzeczywistego, które zajmują się tymi samymi problemami (możesz nie być pierwszy) i które zostały już rozwiązane.

Bernhard Kircher
źródło