2009-07-17 21 views
8

Angenommen, Sie erstellen eine Datenbank zum Speichern von Nachrichten für eine Chat-Room-Anwendung. Es gibt eine unbegrenzte Anzahl von Chatrooms (sie werden zur Laufzeit bei Bedarf erstellt) und alle Nachrichten müssen in der Datenbank gespeichert werden.Datenbankdesign - Milliarden von Datensätzen in einer Tabelle?

Wäre es falsch, eine riesige Tabelle zu erstellen, um Nachrichten für alle Chatrooms zu speichern, in dem Wissen, dass es in dieser einen Tabelle möglicherweise Milliarden von Datensätzen geben könnte?

Wäre es umsichtiger, dynamisch eine Tabelle für jeden erstellten Raum zu erstellen und die Nachrichten dieses Raums nur in dieser Tabelle zu speichern?

+1

Sie können auf Ihre Anwendungsfälle erarbeiten wollen. Hohe Schreibvorgänge? Welche Art von Lesevorgängen? Wenn keine anderen Informationen vorliegen, ist eine Tabelle die "korrekteste". Aber wie das in der realen Welt funktioniert, ist eine völlig andere Frage. Und Sie haben keine Informationen darüber gegeben, damit Leute genau antworten können. –

Antwort

8

Es wäre richtig, eine einzige Tabelle zu haben. Wenn Sie n Tabellen haben, die nach Anwendungsnutzung wachsen, beschreiben Sie, dass Sie die Datenbank selbst als eine Tabelle von Tabellen verwenden. Dies ist nicht so, wie ein RDBMS funktionieren soll. Milliarden von Datensätzen in einer einzigen Tabelle sind in einer modernen Datenbank trivial. Auf dieser Ebene sind Ihre einzigen Leistungsbedenken gute Indizes und wie Sie Joins durchführen.

+2

Um diese Antwort hinzuzufügen ...Sie können eine Tabelle auch basierend auf einer Dimension zusammenfassen. Mechanisch sieht es so aus und funktioniert wie separate Tabellen, ist aber über Indizes nahtlos miteinander verbunden. Auch hier sind weitere Informationen aus dem OP erforderlich. –

4

Während eine Tabelle pro Chatroom ausgeführt werden kann, hat jede Datenbank Beschränkungen hinsichtlich der Anzahl der Tabellen, die erstellt werden können. Bei einer unbegrenzten Anzahl von Chatrooms müssen Sie also eine unendliche Anzahl von Tabellen erstellen nicht zur Arbeit gehen.

Sie können auf der anderen Seite Milliarden von Datenzeilen speichern, Speicher ist normalerweise nicht das Problem angesichts der Raum - Abruf der Informationen in einem vernünftigen Zeitrahmen ist jedoch und erfordert eine sorgfältige Planung.

Sie können die Nachrichten nach einem Datumsbereich partitionieren, und wenn geplant, können Sie mithilfe der LUN-Migration ältere Daten auf langsameren Speicher verschieben, während aktuellere Daten auf dem schnelleren Speicher verbleiben.

8

Milliarden von Datensätzen?

Angenommen, Sie haben ständig 1000 aktive Benutzer mit 1 Nachricht pro Minute, dies ergibt 1,5 Millionen Nachrichten pro Tag und ca. 500 Millionen Nachrichten pro Jahr.

Wenn Sie noch mehrere Jahre alte Chat-Nachrichten speichern müssen (wofür?), Können Sie sie in jahresbasierten Tabellen archivieren.

Ich würde definitiv gegen dynamische Erstellung von Room-basierten Tabellen argumentieren.

+1

Einverstanden. Warum brauchen Sie eine Datenbank, um sich einzuloggen? Verwenden Sie einfach eine TXT-Datei, um die Chats zu archivieren. Ich gehe davon aus, dass Sie die Protokolle aus rechtlichen Gründen benötigen, weshalb Sie wahrscheinlich an eine Datenbank gedacht haben. Eine Dateisystembenutzung wäre viel besser, wenn Sie keine Leseoperationen durchführen müssen. – Zack

+3

Sorry Leute, aber denke nicht so wörtlich. Dies ist nicht das tatsächliche Szenario, aber die Prämisse ist die gleiche. Nehmen Sie Milliarden von Datensätzen an, unabhängig davon, welches Szenario Sie sich vorstellen können. – core

2

Genau genommen ist Ihr Entwurf richtig, ein einzelner Tisch. Felder mit niedriger Entropie {z. B. 'Benutzer-ID' - Sie möchten aus ID-Tabellen verknüpfen, d. h. normalen Datenbanknormalisierungsmustern folgen}

möchten Sie vielleicht über bereichsbasierte Partitionierung nachdenken. z. B. "Kopien" Ihrer Tabelle mit einem Jahrespräfix. Oder vielleicht sogar nur eine 'aktuelle' und Archivtabelle

Diese beiden Ansätze bedeuten, dass Ihre Abfragesemantik komplexer ist {wenn jemand eine mehrjährige Suche durchgeführt hat}, müssten Sie mehrere Tabellen abfragen.

aber der Vorteil ist, dass Ihre "aktuelle" Tabelle in einer ungefähr konstanten Größe bleibt, und Archivierung ist einfacher. - {Sie können nur Tabelle 2005_Chat fallen, wenn Sie Daten von 2005 zu archivieren}

-Ace

Verwandte Themen