2011-01-05 11 views
1

Hoffentlich eine einfache Frage:MySQL InnoDB Designs Fragen

Wäre es besser, 1 zu erstellen) eine einzige „Dokument“ Tabelle mit Zehntausenden von Einträgen oder 2) brechen sie in mehr „document_type“ Tabellen aus?

Zum Beispiel 1) eine "Dokument" -Tabelle mit Spalten user_id, document_type und document_name oder 2) getrennte "document_type" -Tabellen mit Spalten user_id und document_name.

In beiden Fällen haben wir es mit Zehntausenden von Einträgen zu tun.

Mein Instinkt sagt mir Option 1 möglicherweise eine erhebliche Leistungseinbußen vs Option 2. entstehen können

Dank!

Antwort

0

Ihr Leistungshit für die erste Option sollte nicht zu mit richtiger Indizierung sein. Es klingt so, als würden Sie document_name indexieren, dann möglicherweise eines der anderen Felder. Es hängt etwas davon ab, wie viel Sie einfügen gegen Abfrage auch einfügen werden; Wenn Einsätze selten sind, können Sie sich mehr Indexierung leisten.

0

Ich denke, dass Sie einen Leistungshieb in beide Richtungen haben werden ... Wenn Sie mit 2 gehen, müssten Sie eine Union-Abfrage oder mehrere Abfragen durchführen, um Ihr Ergebnis zu erhalten. Zumindest, wenn Sie mit einem gehen, wird es Sie speichern, den Dokumenttyp und die damit verbundene Logik zu bestimmen. Möchten Sie auch eine Spalte, die "Dokumentname" oder eine Beschreibung sein könnte, um dem Benutzer eine Vorstellung davon zu geben, was das Dokument ist?

1

Zehntausende Einträge sind nicht so viel in der Welt der relationalen Datenbanken, vorausgesetzt, die Datenbank wurde richtig entworfen und indiziert. Einige der Dinge zu beachten, wenn Sie mehrere Tabellen erstellen:

  • Es wird schwieriger sein, die Code zu pflegen

  • Die Leistung wählt wird

  • Datenintegrität leiden wird nicht erzwungen

Edit: verbesserte Formatierung

1

Sofern Sie nicht erwarten, dass dies zu Millionen und Abermillionen von Datensätzen und/oder sehr anlagenintensiv wird, gibt es keinen Grund, diese unter keinen Umständen in mehr als eine Tabelle aufzuteilen. Der Zweck der Indexierung in einer Datenbank besteht darin, das Problem mit großen Datasets zu umgehen.

In Ihrem Fall, nehmen Sie an, Sie haben 90K Einträge mit 30K von jedem der drei Typen. Wenn Sie die Spalte document_type indizieren, wäre eine Abfrage, die einen der drei Typen auswählt, fast so schnell wie das Auswählen einer Tabelle, die nur 30K-Einträge des gleichen Typs enthält.

Da Dokument-ID höchstwahrscheinlich ein numerischer Index mit einer hohen Kardinalität ist, vorausgesetzt, Sie indizieren die Spalte - was Sie sollten, sollte es der Primärschlüssel sein - die Auswahl eines Datensatzes eines bestimmten Index ist nur so schnell auf einer Tabelle mit 90K Einträgen von drei Typen wie auf einer Tabelle von 30K Einträgen eines Typs.

Es gibt andere Gründe für die Shard-Daten, aber sie haben mit der Ausführung komplexer Abfragen, transaktionaler Inserts, Tabellen-Joins usw. zu tun.Meiner Erfahrung nach haben Tischdesigner oft das Bedürfnis, Dinge zu zerstückeln, die nicht geteilt werden sollten, was (wie andere Antworten erwähnt haben) zu unnötigen Komplexitäten führt. Die wichtigste Regel der Entwicklung: Mach es einfach!

0

Der einzige Grund, den ich sehe, um die Tabelle zu teilen, ist, wenn es als Unterklassen des Dokuments modelliert werden sollte.

Das heißt, statt:

document 
- document_id (pk) 
- type 
- name 
- attribute_x 
- attribute_y 
- attribute_z 
- attribute_a 
- attribute_b 
- attribute_c 
- attribute_1 
- attribute_2 
- attribute_3 

Sie eine Tabelle für jede Unterklasse von Dokument erstellen:

document 
- document_id (pk) 
- type 
- name 

document_type_1 
- document_id (pk) references document(document_id) 
- attribute_x 
- attribute_y 
- attribute_z 

document_type_2 
- document_id (pk) references document(document_id) 
- attribute_a 
- attribute_b 
- attribute_c 

document_type_3 
- document_id (pk) references document(document_id) 
- attribute_1 
- attribute_2 
- attribute_3 

Die einzige Klasse von Abfragen, die schlimmer sind von der Art, werden „alle Attribute suchen aller Dokumente ". Fast alle anderen Verwendungen werden im Durchschnitt mit der Ein-Tabellen-pro-Unterklasse aufgrund der kleineren Zeilenlänge schneller (im Durchschnitt passen mehr Zeilen in den Cache und jede gelesene Platte gibt mehr Zeilen zurück).