Best Practice zum Speichern von Datensatzmetadaten

10

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:

  1. 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
  2. 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
  3. 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?

Tiddo
quelle
Über welche Art von Metadaten sprechen wir? Vielleicht könnte die Verwendung einer hstoreoder einer JSONSpalte Ihr Problem lösen?
a_horse_with_no_name
@a_horse_with_no_name - Im Moment benötige ich nur Erstellungszeit, Aktualisierungszeit und Erstellungsquelle. Die Felder sind fest, so dass ich keinen Schlüsselwert wie Speicher benötige. Ich mache mir nur Sorgen, wo ich die Daten speichern soll.
Tiddo
1
Dann sehe ich keinen Grund, diese drei Spalten nicht zur Basistabelle hinzuzufügen.
a_horse_with_no_name

Antworten:

7

Die Spalten, über die Sie sprechen, belegen 20 Bytes (wenn sie ohne Auffüllen ausgerichtet sind):

Erstellungszeit, Aktualisierungszeit und Erstellungsquelle

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 UPDATEzu 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.

Erwin Brandstetter
quelle
Was ist mit der Lösung dieses Problems durch Tabellenvererbung? Gibt es bemerkenswerte Nachteile im Vergleich zur Verwendung von Metadatenspalten direkt in der Tabelle? Wenn ich jedoch richtig verstehe, ist die Tabellenvererbung von postgres nicht SQL-Standard-konform, oder?
Devrys
1
@devrys: Vererbung hat einige Einschränkungen in Postgres Wichtiger: Ich sehe nicht, wie Vererbung das Speichern einiger zusätzlicher Spalten pro Zeile lösen könnte . Es wäre eine Option, wenn Sie einige Zeilen mit und andere Zeilen ohne Metadaten haben. Aber dafür würde ich es nicht benutzen.
Erwin Brandstetter