2011-09-14 7 views
5

Scenariusz: Projektowanie czatu dla różnych użytkowników do czatowania na raz. Wszystkie czaty muszą zostać zapisane. Za każdym razem, gdy użytkownik się loguje, powinien widzieć wszystkie poprzednie rozmowy.Projekt bazy danych dla czatu. Musisz zapisać każdy czat

Oto jeden z przykładów w tabeli, które mogą być używane do przechowywania czaty:

CREATE TABLE chat 
(
    chat_id int NOT NULL auto_increment, 
    posted_on datetime NOT NULL, 
    userid int NOT NULL, 
    message text NOT NULL, 
    PRIMARY KEY (chat_id), 
    FOREIGN KEY(userid) references users(userid) on update cascade on delete cascade 
); 

do pobierania czatów w odpowiedniej kolejności, potrzebuję klucz podstawowy w tabeli, w której jestem przechowywania czatów. Tak więc, jeśli użyję powyższej tabeli do przechowywania czatów, nie będę mógł przechowywać więcej niż 2147483647 czatów. Oczywiście, mogę użyć jakiegoś typu, który ma duży zasięg jak unsigned bigint, ale nadal będzie miał pewien limit.

Jednak scenariusz mówi, że czaty, które mają zostać zapisane, mogą być nieskończone, więc jaki rodzaj tabeli powinienem wykonać? Czy powinienem zrobić inny klucz podstawowy?

Pomóż mi rozwiązać problem. Zastanawiam się, jak Google lub Facebook zarządzają zapisaniem każdego czatu.

+1

Co jest nie tak z Bigintem? Daje to zakres do 9223372036854775807 unikalnych instancji. Jeśli masz 1 miliard czatów dziennie, to zajmie to 9 miliardów lat, zanim przekroczysz ten zakres. – selbie

+0

Ale myślę, że posiadanie dużego stołu to wada perforacji. – Paddy

+0

@selbie Ktoś powiedział mi, gdy tabela stała się zbyt duża, po prostu zrzuć dane tabeli do pliku, a następnie opróżnij tabelę i kiedy dane są wymagane, po prostu wczytaj dane z pliku do tabeli. I tak Google lub fb zapisuje nieskończone dane. Ale nie wiem, czy to jest poprawny soln, czy jest to poprawne, jak dokładnie to zaimplementować. – Paddy

Odpowiedz

0

Jeśli nie korzystałeś z MySQL, klucz podstawowy identyfikatora użytkownika i znacznika czasu prawdopodobnie działałby prawidłowo. Ale znacznik czasu MySQL jest rozwiązany tylko na jedną sekundę. (Zobacz poniżej najnowsze zmiany, które mają wpływ na tę odpowiedź.) Istnieje kilka sposobów na obejście tego.

  • kod aplikacji Let obsłużyć naruszenie klucza podstawowego przez czeka sekundę, a następnie ponowne przesłanie.
  • Niech kod aplikacji zapewnia bardziej precyzyjny znacznik czasu i przechowuje jako sortowalny CHAR (n), np. "2011-01-01 03: 45: 46.987".
  • Przełącz na dbms, który obsługuje znaczniki czasu o szybkości mikrosekund.

Cały ten kod aplikacji musi być kodem po stronie serwera, jeśli ma zostać zapisane zapytanie przedstawiające wiersze uporządkowane według znacznika czasu.

Później

Aktualna wersja MySQL obsługuje fractional seconds in timestamps.

+0

MariaDB 5.3 (nadal w wersji beta) obsługuje mikrosekundy w datakach i sygnaturach czasowych: http://kb.askmonty.org/en/microseconds-in-mariadb –

+0

Uruchomienie klucza o niesekwencyjnej wartości, takiej jak identyfikator użytkownika, spowoduje dane do losowego wstawienia do stołu w różnych punktach. Najlepiej sekwencyjnie dodawać nowe dane na końcu tabeli. Szczególnie pomaga w indeksach. –

Powiązane problemy