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?

6voto

Eran Galperin Punkte 84916

Beim Entwurf einer Datenbankstruktur ist es am besten, wenn normalisieren und ändern Sie diese, nachdem Sie Ihre Abfragen profiliert und einem Benchmarking unterzogen haben. Die Normalisierung zielt darauf ab, Datenduplikation zu verhindern, die Integrität zu erhöhen und die richtigen Beziehungen zwischen Ihren Daten zu definieren.

Bedenken Sie, dass die Durchführung der Verbindung auch mit Kosten verbunden ist, so dass es schwer zu sagen ist, ob Ihre Idee etwas bringt. Eine ordnungsgemäße Indizierung mit einer normalisierten Struktur wäre viel hilfreicher.

Und was die Sperren auf Zeilenebene betrifft, so hängt dies von der Speicher-Engine ab - einige verwenden Sperren auf Zeilenebene, andere verwenden Tabellensperren.

4voto

dkretz Punkte 36862

Ihr anfänglicher Datenbankentwurf sollte ausschließlich auf konzeptionellen und relationalen Überlegungen beruhen, völlig unabhängig von physikalischen Überlegungen. Datenbanksoftware ist so konzipiert und gedacht, dass sie ein gutes relationales Design unterstützt. Sie werden diese Überlegungen kaum jemals lockern müssen, um die Leistung zu verbessern. Denken Sie anfangs nicht einmal an die Kosten von Joins, Sperren und Aktivitätstypen. Im weiteren Verlauf sollten Sie diese Überlegungen aufschieben, bis alle anderen Möglichkeiten ausgeschöpft sind.

Ihr rdbms ist Ihr Freund, nicht Ihr Widersacher.

0voto

James Piggot Punkte 407

Sie sollten die beiden Tabellen getrennt aufbewahren, da Sie möglicherweise den Verlauf der Frage aufzeichnen möchten. Die Haupttabelle "Frage" wird durch die Frage-ID indiziert, die Tabelle "Status" wird durch die Abfrage-ID und den Datums-/Zeitstempel indiziert und enthält jedes Mal eine Zeile, wenn sich der Status ändert.

Ich weiß nicht, ob die Aktualisierungen wirklich von Bedeutung sind, es sei denn, Sie verwenden eine pessimistische Sperrung, bei der die Zeile für einen bestimmten Zeitraum gesperrt wird.

0voto

GateKiller Punkte 71039

Ich würde mir die Zwischenspeicherung Ihrer Ergebnisse entweder lokal mit Asp.net Caching oder mit MemCached ansehen.

0voto

WW. Punkte 22847

Dies wäre sicherlich eine schlechte Idee, wenn Sie Oracle verwenden würden. In Oracle können Sie ohne weiteres Datensätze lesen, während andere Sitzungen diese ändern, da die Konkurrenzen in mehreren Versionen gesteuert werden. Sie würden ohne Einsparungen zusätzliche Leistungseinbußen bei der Verknüpfung erleiden.

Ein nützliches Entwurfsmuster ist jedoch die Vorverknüpfung von Tabellen, die Vorberechnung von Aggregaten oder die Vorabanwendung von Where-Klauseln mithilfe von materialisierten Ansichten.

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