2009-07-17 9 views
8

Załóżmy, że tworzysz bazę danych do przechowywania wiadomości dla aplikacji do pokojów rozmów. Istnieje nieskończona liczba pokojów rozmów (są one tworzone w czasie rzeczywistym na żądanie), a wszystkie wiadomości muszą być przechowywane w bazie danych.Projektowanie bazy danych - miliardy rekordów w jednym stole?

Czy błędem byłoby stworzenie jednego gigantycznego stołu do przechowywania wiadomości dla wszystkich pokojów rozmów, wiedząc, że w tym jednym stole może znajdować się miliard płyt?

Czy byłoby rozsądniej dynamicznie tworzyć tabele dla każdego utworzonego pokoju i przechowywać wiadomości tego pokoju tylko w tym stole?

+1

Może chcesz rozwinąć swój przypadków użycia. Wysokie zapisy? Jaki rodzaj czyta? Nie ma innych informacji, jedna tabela jest "najbardziej poprawna". Ale to, jak działa w świecie rzeczywistym, jest zupełnie odrębnym pytaniem. I nie podałeś żadnych informacji na ten temat, aby ludzie mogli dokładnie odpowiedzieć. –

Odpowiedz

8

Właściwe byłoby posiadanie jednego stołu. Gdy masz n tabel, które rosną według użycia aplikacji, opisujesz używanie samej bazy danych jako tabeli tabel, co nie jest sposobem w jaki RDBMS ma działać. Miliardy rekordów w jednej tabeli są banalne w nowoczesnej bazie danych. Na tym poziomie jedynymi problemami z wydajnością są dobre indeksy i sposób łączenia.

+2

Aby dodać do tej odpowiedzi ...Możesz także stowarzyszyć tabelę na podstawie pewnego wymiaru. Mechanicznie wygląda i działa jak oddzielne tabele, ale jest płynnie łączony przy użyciu indeksów. Ponownie potrzebne są dodatkowe informacje z PO. –

4

Podczas gdy można wykonać tabelę na czacie, każda baza danych ma ograniczenia w stosunku do liczby tabel, które mogą zostać utworzone, więc biorąc pod uwagę nieskończoną liczbę pokojów rozmów, musisz utworzyć nieskończoną liczbę tabel, która jest nie pójdzie do pracy.

Z drugiej strony można przechowywać miliardy wierszy danych, a przechowywanie nie jest normalnie problemem z uwagi na przestrzeń - odzyskanie informacji w rozsądnym okresie czasu wymaga jednak starannego planowania.

Wiadomości można podzielić na partycje według zakresu dat, a jeśli są zaplanowane, można użyć migracji LUN, aby przenieść starsze dane do wolniejszej pamięci, pozostawiając bardziej aktualne dane na temat szybszego przechowywania.

8

Miliardy rekordów?

Zakładając, że masz stale 1000 aktywnych użytkowników z 1 komunikatem na minutę, daje to 1,5 miliona wiadomości dziennie i około 500 milionów wiadomości rocznie.

Jeśli nadal chcesz przechowywać wiadomości na czacie przez kilka lat (po co?), Możesz je zarchiwizować w tabelach rocznych.

Zdecydowanie sprzeciwiłbym się dynamicznemu tworzeniu stołów w pokoju.

+1

Uzgodnione. Dlaczego potrzebujesz bazy danych do logowania? Po prostu użyj pliku .txt do archiwizacji czatów. Zakładam, że potrzebujesz dzienników z powodów prawnych, dlatego prawdopodobnie pomyślałeś o bazie danych. Użycie systemu plików byłoby o wiele lepsze, gdyby nie trzeba było wykonywać operacji odczytu. – Zack

+3

Przykro mi, ale nie myślcie tak dosłownie. To nie jest rzeczywisty scenariusz, ale założenie jest takie samo. Przyjmij miliardy rekordów, niezależnie od scenariusza, jaki możesz sobie wyobrazić. – core

2

Ściśle mówiąc, Twój projekt ma rację, pojedynczy stół. pola o niskiej entropii {np. userid '- chcesz połączyć się z tabelami identyfikatorów, tj. po normalnych wzorcach normalizacji bazy danych)

możesz chcieć pomyśleć o partycjonowaniu na podstawie zakresu. np. "kopie" twojej tabeli z prefiksem roku. A może nawet po prostu "aktualna" i archiwalna tabela. Oba te podejścia oznaczają, że semantyczne zapytanie jest bardziej złożone (rozważmy, czy ktoś wykonał wyszukiwanie przez wiele lat), musiałoby zapytać wiele tabel.

Jednak pozytywnym aspektem jest to, że twoja "aktualna" tabela pozostanie na mniej więcej stałym rozmiarze, a archiwizacja będzie prostsza. - {można po prostu upuść tabeli 2005_Chat gdy chcesz zarchiwizować dane 2005}

-Ace

Powiązane problemy