2 Stimmen

Was ist schneller: Viele Zeilen oder viele Spalten?

Ist es in MySQL generell schneller/effizienter/skalierbarer, 100 Zeilen mit 3 Spalten oder 1 Zeile mit 100 Spalten zurückzugeben?

Mit anderen Worten: Ist es bei der Speicherung vieler Schlüssel-Wert-Paare in Bezug auf einen Datensatz besser, jedes Schlüssel-Wert-Paar in einer separaten Zeile mit der Datensatz-ID als Schlüssel zu speichern, oder eine Zeile pro Datensatz-ID mit einer Spalte für jeden Schlüssel zu haben?

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

Editar: Zur Klarstellung: Mit "regelmäßig" meine ich das Hinzufügen oder Entfernen eines Schlüssels einmal im Monat oder so.

9voto

Bjarke Freund-Hansen Punkte 25882

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

2voto

HLGEM Punkte 91543

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

Es gibt eine Menge schlechter Dinge an diesem Modell, und ich würde es nicht verwenden, wenn es eine Alternative gäbe. Wenn Sie die Mehrheit der Datenspalten, die Sie für Ihre Anwendung benötigen, nicht kennen (mit Ausnahme einiger benutzerdefinierter Felder), müssen Sie mehr Zeit für die Entwicklung aufwenden und sie herausfinden.

1voto

Quassnoi Punkte 396418

Wenn Ihre Tasten voreingestellt sind (zur Entwurfszeit bekannt), dann sollten Sie jede Taste in eine eigene Spalte setzen.

Wenn sie zur Entwurfszeit nicht bekannt sind, müssen Sie Ihre Daten als eine Liste von Schlüssel-Wert-Paaren zurückgeben, die Sie später außerhalb der RDBMS .

1voto

Neil Punkte 387

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

Beim mehrspaltigen Ansatz werden Sie feststellen, dass Ihre Tabelle unbegrenzt wächst, da beim Entfernen der Spalte alle Werte vernichtet werden, und das wollen Sie nicht tun. Ich spreche hier aus Erfahrung, da ich an einem Altsystem gearbeitet habe, das eine Tabelle mit fast 1000 Spalten hatte, von denen die meisten Bitfelder waren. Irgendwann ist man nicht mehr in der Lage, das Löschen einer der Spalten zu begründen, weil jemand könnte und das letzte Mal, als Sie das taten, mussten Sie bis 2 Uhr morgens arbeiten, um auf Backups zurückzugreifen.

0voto

Middletone Punkte 4166

Erstens: Bestimmen Sie, wie häufig auf Ihre Daten zugegriffen werden muss. Wenn die Daten immer auf einen Schlag abgerufen und größtenteils verwendet werden müssen, sollten Sie alle Schlüsselpaare als serialisierten Wert oder als XML-Wert speichern. Wenn Sie irgendeine Art von komplexer Analyse mit diesen Daten durchführen müssen und die Wertepaare benötigen, sind Spalten in Ordnung, aber beschränken Sie sie auf Werte, von denen Sie wissen, dass Sie sie für Ihre Abfragen benötigen. Es ist im Allgemeinen einfacher, Abfragen zu entwerfen, die eine Spalte für einen Parameter verwenden als eine Zeile. Es ist auch einfacher, mit den zurückgegebenen Werten zu arbeiten mit den zurückgegebenen Werten zu arbeiten, wenn sie alle in einer Zeile stehen, statt in mehreren.

Zweitens: Trennen Sie die Daten, auf die am häufigsten zugegriffen wird, und legen Sie sie in eine eigene Tabelle und die anderen Daten in eine andere Tabelle. 100 Spalten sind übrigens eine Menge, daher empfehle ich Ihnen, Ihre Daten in kleinere, besser zu verwaltende Teile aufzuteilen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X