2016-11-03 6 views
0

Ich habe eine Entität, die aus einigen fixen Attributen und einigen variablen Attributen besteht, die versioniert werden sollen. Dies führt zu einem Datenbankentwurf mit einer Tabelle für die Fixteile (Tabelle F) und einer Tabelle für die versionierten Teile (Tabelle V).Wie man Versionen in der Datenbank modelliert?

V hat eine viele zu eins Beziehung zu F (eine Einheit viele haben viele Versionen). F hat eine eins zu eins Beziehung zu einem V, um die aktuelle Version anzuzeigen. Dies führt zu zirkulären Abhängigkeiten in unserer Datenbank, die das Leben schwer machen.

Wir bevorzugen eine Lösung, die Datenkonsistenz auf Datenbankebene gewährleistet (daher ist das Setzen eines currentversoin-Flags auf V keine Lösung, da wir nicht sicherstellen können, dass es im Falle eines Fehlers nicht mehrere aktuelle Versionen gibt). Siehst du irgendeinen besseren Weg, dies ohne Kreise zu modellieren?

+0

Nur eine erbärmliche Anzahl von Einschränkungen kann von SQL-DBMS deklarativ erzwungen werden. Tatsächlich gibt es keinen Grund, warum sie Zyklen in FK-Bedingungen nicht zulassen könnten. Also müssen Sie zu Auslösern wechseln. Für einen Ansatz, Trigger-implementierte deklarativ spezifizierte willkürliche Beschränkungen zu triggern, siehe Applied Mathematics for Database Professionals von deHaan & Koppelaars. – philipxy

+0

Wenn Sie so sehr auf Konsistenz bedacht sind, warum speichern Sie redundante Daten? Wenn die neueste Version eine Funktion der Versionen einer Entität ist, wie die Max, müssen Sie dieses Kriterium in Ihre Anfrage einfügen, um F & V zu verbinden. Andernfalls sollte die Versionsnummer Teil einer FK in V to F sein. PS Es wäre wahrscheinlich hilfreich für Sie, ein Beispiel mit DDL und Daten zu geben. PS Ich erwarte, dass deine Frage ein Duplikat ist, suche weiter. – philipxy

+0

Ich vermute, dass es irgendwo einen Ausbildungskurs gibt, der den Schülern sagt, dass es wirklich sehr schlecht ist, * potentielle * Joins in ihrem Schema zu haben, die Schleifen bilden. In diesem Fall sehe ich kein Problem. Eine Alternative wäre, die neueste Version dynamisch zu berechnen, was ziemlich billig wäre. Kannst du erklären, was das Problem hier ist? –

Antwort

0

Entfernen Sie die Referenz in F auf die aktuelle Version in V. Es wird einfach nicht benötigt. Die aktuelle Version ist die neueste Version.

Hier sind einige Merkmale einer Versionierung Design „must have“:

  • Ein und nur ein Datum/Zeit-Wert (kein FROM/TO Datum Paare)
  • kein separates Feld verwendet, um den Strom, um anzuzeigen, Ausführung.
  • Das Erstellen einer neuen Version beinhaltet das Schreiben eines Datensatzes. Keine Aktualisierung anderer Versionen.
  • Fremdschlüsselreferenzen funktionieren wie immer.
  • Verwenden Sie ein Standardmuster, das konsistent und bereits gut bekannt ist (in diesem Fall ist das Muster 2nf).

Here ist eine Antwort mit mehr Details. Es enthält auch Links zu noch mehr Details, wenn Sie glauben, dass es vielversprechend ist.

Verwandte Themen