Was ist die beste Vorgehensweise zum Speichern von Metadaten einzelner Datensätze in einer Datenbank?
Ich muss allgemeine Metadaten wie Erstellungszeit und Zeitpunkt der letzten Aktualisierung für viele Tabellen in meiner Datenbank speichern. Ich habe ein paar verschiedene Lösungen gefunden:
Speichern Sie die Metadaten direkt in den Tabellen.
Vorteile:
- Metadaten sind direkt mit Datensätzen verknüpft
- Zum Abrufen von Metadaten sind keine Verknüpfungen erforderlich
Nachteile:
- Es sind viele doppelte Spalten erforderlich (sofern keine Vererbung verwendet wird).
- Metadaten und Geschäftsdaten werden nicht getrennt
Erstellen Sie eine allgemeine Metadatentabelle mit und verwenden Sie Soft-Fremdschlüssel, um Daten mit den richtigen Tabellen und Datensätzen zu verknüpfen.
Vorteile:
- Keine Vervielfältigung von Spalten
- Metadaten werden von Geschäftsdaten getrennt
Nachteile:
- Keine direkten Verknüpfungen zwischen Metadaten und Daten (FKs können nicht verwendet werden)
- Joins erfordern eine zusätzliche Bedingung
Erstellen Sie individuelle Metadatentabellen für jede Tabelle, für die Metadaten erforderlich sind.
Vorteile:
- Metadaten sind direkt mit Datensätzen verknüpft
- Metadaten werden von Geschäftsdaten getrennt
Nachteile:
- Viele zusätzliche Tische sind erforderlich
- Es sind viele doppelte Spalten erforderlich (sofern keine Vererbung verwendet wird).
Gibt es mehr Optionen, Vor- oder Nachteile als die hier genannten? Und was ist die beste Vorgehensweise zum Speichern dieser Metadaten?
hstore
oder einerJSON
Spalte Ihr Problem lösen?Antworten:
Die Spalten, über die Sie sprechen, belegen 20 Bytes (wenn sie ohne Auffüllen ausgerichtet sind):
Zeitstempel .. 8 Bytes
Zeitstempel .. 8 Bytes
Integer .. 4 Bytes
Der Tupel-Header und der Elementzeiger für eine separate Zeile in einer separaten Tabelle würden allein 23 + 1 + 4 = 28 Bytes plus die 20 Bytes der tatsächlichen Daten plus 4 Bytes Auffüllen am Ende belegen. Macht 52 Bytes pro Zeile . Lesen Sie hier mehr:
In Bezug auf die Speicherung haben Sie nichts zu gewinnen. In Bezug auf die Leistung verlieren Sie mit nur 16 - 24 Bytes mehr pro Zeile kaum etwas.
Die Spalten gehören auch direkt zur Zeile, daher ist es sinnvoll, sie zusammenzuhalten. Ich mache es mir zur Gewohnheit, genau solche Spalten (plus separate Quelle für das letzte Update) zu allen relevanten Tabellen hinzuzufügen.
Es ist auch einfacher, eine
TRIGGER ON INSERT OR UPDATE
zu schreiben , um sie auf dem neuesten Stand zu halten.Lange Rede, kurzer Sinn: eine starke Stimme für Ihre Option 1 .
Wo ich mich für Option 3 entscheiden würde :
Wenn die Metadaten häufig aktualisiert werden, während die Kernzeile dies nicht ist. Dann könnte es sich lohnen, eine separate 1: 1-Tabelle zu führen, um UPDATEs billiger zu machen und das Aufblähen auf dem Haupttisch zu reduzieren - oder sogar Option 2 zu wählen.
Wo ich mich für Option 2 entscheiden würde :
Wenn sich der Satz von Metadatenspalten stark wiederholt. Sie könnten eine FK-Spalte für den Satz von Metadaten in den Haupttabellen haben. Spart nicht viel für drei kleine Spalten wie in Ihrem Beispiel.
quelle