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?
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
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
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? –