2 Stimmen

DB Entwurf: Verbessert sich die Leistung, wenn man 2 Tabellen hat (eine ist für das Lesen, eine für das Schreiben optimiert)?

Ich denke über ein DB-Design-Problem nach.

Ich entwerfe zum Beispiel diese Stackoverflow-Website, auf der ich eine Liste von Fragen habe.

Jede Frage enthält bestimmte Metadaten, die sich wahrscheinlich nicht ändern werden. Jede Frage enthält auch bestimmte Daten, die sich ständig ändern werden (Datum der letzten Ansicht, Gesamtzahl der Ansichten... usw.)

Wäre es besser, eine Haupttabelle zu haben, um die konstanten Metadaten zu lesen und eine Verknüpfung durchzuführen und auch die sich ändernden Werte in einer anderen Tabelle zu speichern?

OU

Wäre es besser, alles in einer Tabelle zusammenzufassen?

Ich bin mir nicht sicher, ob dies der Fall ist, aber ist die ROW bei der Aktualisierung gesperrt?

0voto

MicSim Punkte 25646

Wie bereits gesagt, beginnen Sie besser mit einem sauberen, normalisierten Design. Es ist einfach einfacher, später zu denormalisieren, als den umgekehrten Weg zu gehen. Die Erfahrung lehrt, dass Sie diese eine große Tabelle niemals denormalisieren werden! Sie werden einfach weitere Spalten nach Bedarf einfügen. Und Sie werden immer mehr Indizes benötigen und die Aktualisierungen werden immer langsamer.

Sie sollten auch einen Blick auf die zu erwartenden Belastungen werfen: Wird es mehr neue Antworten geben oder nur mehr Abfragen? Welche anderen Operationen werden Sie haben? Für die Optimierung können Sie die Funktionen Ihres DBMS-Systems nutzen: Indizierung, Ansichten, ...

0voto

MikeD Punkte 13918

Eran Galperin hat den größten Teil meiner Antwort bereits gegeben. Außerdem würde Ihnen die von Ihnen vorgeschlagene Struktur in Bezug auf das Sperren nicht wirklich helfen. Wenn sich in derselben Zeile relativ statische und dynamische Attribute befinden, ist die Aufteilung der statischen und dynamischen Attribute in zwei Tabellen nicht von großem Nutzen. Es spielt keine Rolle, ob statische Daten gesperrt werden, da ohnehin niemand versucht, sie zu ändern.

Es kann sogar sein, dass Sie mit diesem Entwurf noch schlechter abschneiden. Einige Datenbank-Engines verwenden Seitensperren. Wenn eine Tabelle weniger/kleinere Spalten hat, passen mehr Zeilen auf eine Seite. Je mehr Zeilen sich auf einer Seite befinden, desto wahrscheinlicher ist es, dass es zu einem Sperrkonflikt kommt. Durch die Vermischung von statischen und dynamischen Daten sind die Zeilen größer, daher gibt es weniger Zeilen auf einer Seite und daher weniger Wartezeiten bei Seitensperren.

Wenn Sie zwei unabhängige Sätze von dynamischen Attributen haben und diese normalerweise von verschiedenen Akteuren geändert werden, könnten Sie einen gewissen Nutzen daraus ziehen, sie in verschiedene Tabellen aufzuteilen. Dies ist jedoch ein ziemlich ungewöhnlicher Fall.

Ich möchte auch darauf hinweisen, dass die Aufteilung der Tabelle in einen statischen und einen dynamischen Teil in einer relativ kleinen Umgebung vielleicht nicht von Vorteil ist, aber in einer großen verteilten Umgebung kann es nützlich sein, die dynamischen Daten mit anderen Raten als die statischen Daten zu cachen und zu replizieren.

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