2009-07-29 14 views
2

Ist es in MySQL im Allgemeinen schneller/effizienter/skalierbarer, 100 Zeilen mit 3 Spalten oder 1 Zeile mit 100 Spalten zurückzugeben?Was ist schneller: Viele Zeilen oder viele Spalten?

Mit anderen Worten, wenn viele key => value-Paare zu einem Datensatz gespeichert werden, ist es besser, jedes key => value-Paar in einer separaten Zeile mit der record_id als Schlüssel oder pro Zeile zu speichern record_id mit einer Spalte für jeden Schlüssel?

Nehmen Sie auch an, dass Schlüssel ziemlich regelmäßig hinzugefügt/entfernt werden müssen, was die langfristige Wartbarkeit des Ansatzes mit vielen Spalten beeinflussen würde, sobald die Tabelle ausreichend groß wird.

Edit: zu klären, durch "eine regelmäßige Basis" meine ich die Zugabe oder Entfernung eines Schlüssels einmal im Monat oder so.

Antwort

10

Sie sollten niemals Spalten regelmäßig hinzufügen oder entfernen.

+3

Einmal im Monat ist regelmäßige Basis. Sobald Ihre Anwendung in Produktion geht, sollten Sie das Datenbankschema niemals ändern. Die einzige Ausnahme besteht darin, dass sich Ihre geschäftlichen Anforderungen grundlegend ändern. –

+2

Diese Antwort beantwortet nicht die Frage, ob ein Schema mit mehr Spalten oder mehr Zeilen schnellere Abfragen zur Folge hat. Außerdem gibt es keine Erklärung für diese Antwort, die nicht die tatsächliche Entwicklung der Software widerspiegelt. Ich verstehe nicht, warum diese Antwort die "richtige" Antwort ist. – GregT

1

Wenn Ihre Schlüssel voreingestellt sind (zur Entwurfszeit bekannt), dann sollten Sie jeden Schlüssel in eine separate Spalte einfügen.

Wenn sie in der Entwurfszeit nicht bekannt sind, müssen Sie Ihre Daten als Liste der Schlüssel/Wert-Paare zurückgeben, die Sie später außerhalb der RDBMS analysieren sollten.

1

Wenn Sie Schlüssel/Wert-Paare speichern, sollten Sie eine Tabelle mit zwei Spalten haben, eine für den Schlüssel (machen Sie dies die PK für die Tabelle) und eine für den Wert (wahrscheinlich brauchen Sie dies überhaupt nicht indiziert)). Denken Sie daran: "Der Schlüssel, der ganze Schlüssel und nichts als der Schlüssel."

Im mehrspaltigen Ansatz werden Sie feststellen, dass Ihre Tabelle ohne Grenzen wächst, da das Entfernen der Spalte alle Werte aufsperrt und Sie nicht wollen. Ich spreche aus Erfahrung, da ich an einem Legacy-System gearbeitet habe, das eine Tabelle mit fast 1000 Spalten hatte, von denen die meisten Bitfelder waren. Irgendwann hörst du auf, in der Lage zu sein, den Fall zu machen, um irgendeine der Spalten zu löschen, weil jemand könnte es verwenden und das letzte Mal, als du es getan hast, hattest du bis 2 Uhr Arbeit zurück zu Backups.

2

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

Es gibt viele schlechte Dinge über dieses Modell und ich würde es nicht verwenden, wenn es eine andere Alternative. Wenn Sie die Mehrheit der Datenspalten, die Sie für Ihre Anwendung benötigen, nicht kennen (mit Ausnahme einiger benutzerdefinierbarer Felder), müssen Sie mehr Zeit in das Design investieren und es herausfinden.

0

Zuerst: Bestimmen Sie, wie oft auf Ihre Daten zugegriffen werden muss. Wenn die Daten immer in einer Aufnahme abgerufen werden müssen und die meisten davon verwendet werden, sollten Sie alle Schlüsselpaare als serialisierten Wert oder als XML-Wert speichern. Wenn Sie für diese Daten eine komplexe Analyse durchführen müssen und die Wertepaare benötigt werden, sind die Spalten in Ordnung, aber beschränken Sie sie auf Werte, von denen Sie wissen, dass Sie Ihre Abfragen ausführen müssen. Es ist im Allgemeinen einfacher, Abfragen zu entwerfen, die für einen Parameter eine Spalte als Zeile verwenden. Sie werden es auch einfacher finden, mit die zurückgegebenen Werte zu arbeiten, wenn sie alle in einer Zeile als viele sind.

Zweitens: trennen Sie Ihre am häufigsten verwendeten Daten und legen Sie sie in eine eigene Tabelle und die anderen Daten in einem anderen. 100 Spalten ist übrigens sehr viel, daher empfehle ich, dass Sie Ihre Daten in kleinere Stücke aufteilen, die leichter zu handhaben sind.

Schließlich: Wenn Sie Daten haben, die sich häufig ändern können, sollten Sie die Spalte (Schlüssel) in einer Tabelle erstellen und dann ihren numerischen Schlüsselwert verwenden, für den Sie den Schlüsselwert speichern würden.Dies setzt voraus, dass Sie denselben Schlüssel mehr als einmal verwenden und Ihre Suche beschleunigen sollten, wenn Sie Ihre Suche durchführen.