Datenbank-Design - Frage nach Effizienz (und allgemeiner Design-Qualität)
-
27-09-2019 - |
Frage
Ich fürchte, ich weiß nicht, was ich tue.
1:
habe ich eine Tabelle namens ticket
, die eine Spalte total
genannt hat. Wenn die Gesamt aktualisiere Ich möchte eine Aufzeichnung davon (alt insgesamt, etc.) halten, so dass ich die total
Spalte entfernen entschieden und erstellen die eine Tabelle namens ticket_total
mit Spalten ticket_id
, total
und datetime
(die jüngsten natürlich "aktuelle" insgesamt).
oder
2:
Dann wurde mir klar, dass ich später meinen Kunden die Möglichkeit, will geben Karten von total
zu sortieren, oder Pull-Berichten, die die Summen aggregieren, etc. So entschied ich mich, anstatt die total
Spalt auf ticket
zurück zu setzen und zu ändern die total
Spalte direkt, wenn die Gesamt aktualisiert wird, aber zuerst eine ticket_total
Reihe als Aufzeichnung des vorherigen total
erstellen.
Es scheint, dass die Version 2 wäre sehr leistungsfähig sein, weil ich nicht brauchen würde die damit verbundene ticket_total
Tabelle so viel zu fragen, aber ich frage mich, was Sie Gurus DB da draußen denken. Ich bin nur Datenbank-Design Lernen und Angst ich nie es gut sein würde.
Lösung
Ich würde mit der Option gehen 2, dass Sie vorgeschlagen haben.
So stellen Sie sicher, dass Sie das Update (von Ticket) tun + Insert (in ticket_total) in einer Transaktion, um sicherzustellen, dass die Integrität beibehalten wird.
Andere Tipps
Ihre zweite Alternative ist schneller, aber wenn Sie Berichte über historische Werte der Gesamt erstellen möchten, sollten Sie eine separate Tabelle haben soll, wo Sie den Wert speichern Sie ersetzen zusammen mit einem Zeitstempel. Diese Art der Tabelle wird als ein Audit-Tabelle .
Re: „Effizienz“ - am besten ist es, nicht zu viel über Datenbank Effizienz zu Beginn eines Projektes kümmern. Vorzeitige Optimierung ist ein häufiger Fehler zu vermeiden.
ist besser Ihre Bedürfnisse und Design, um sie zu konzentrieren. Später können Sie testen, ob in dem die Performance-Engpässe sind und die Arbeit an ihrer Lösung.
Für kleinere Datenbanken (Zehntausende von Zeilen), auch „ineffizient“ Anfragen gehen oft sehr schnell gegeben heutige Server und Software.
Keep it simple Ich schlage vor, dass Sie Kombinationstasten zu vermeiden und Überlastungen Tabelle Semantik, wenn Sie wirklich die Notwendigkeit haben.
Vorschlag Sie haben zwei Arten von Daten:. Aktueller Ticket-Informationen und eine History-Tabelle für alte "total" Werte
So Ihre ver 2 würde bevorzugt werden.
ticket
id
field_a
field_b
total # current_total
ticket_total # history of ticket total field
id
ticket_id
total
create_time
Auch "total" klingt wie eine Ansammlung von etwas. Ich schlage vor, dass Sie versuchen, mit einem Feldnamen zu entwickeln, die mehr beschreibend. - Was ist das Feld insgesamt? "Total_worktime"?
hinzugefügt Denken Sie daran, Indizes für die Tabellen hinzuzufügen. Index von etwas, dass Sie für Funde verwenden. Zum Beispiel hat die Tickettabelle einen customer_id hat? Stellen Sie sicher, dass es indiziert.
würde ich einen Blick macht ticket_total, keinen Tisch. Ich würde eine andere Ansicht ticket_current schaffen, wo ich die Karten nach dem Endtermin filtern würde, das heißt, wenn das Ticket Tabelle Dual verkeilt auf ticket_id und Datumzeit ist. Wenn nicht, außer Acht lassen, dass im letzten Teil.