DB-Struktur | Ewige Historie | Zusammenführen von DBs



  • Hallo,

    ich möchte für eine Anwendung eine DB-Struktur haben, bei der ich folgende Eigenschaften habe

    a) Einmal erzeugte Datensätze werden nie wieder geändert, sondern nur auf "veraltet" gesetzt. So möchte ich ermöglichen, dass man jede Änderung nachvollziehen kann.

    b) Es soll die Möglichkeit bestehen, dass man x-Datenbestände einfach zusammenführen kann.

    Zu beiden Sachen habe ich Vorstellungen, wie man das machen kann, aber ich möchte mich gerne darüber informieren, wie man das am besten macht.
    Leider weiß ich nicht genau, wonach ich suchen muss.

    zu a) ist, denke ich, relativ einfach: ein Datensatz hat eine ID und eine Version, wenn der DS verändert wird, wird statt einem Update ein Insert mit derselben ID und Version+1 angelegt. Wahrscheinlich ist für Geschwindigkeit auch noch eine Flagge in dem alten Datensatz zu setzen.

    zu b) Natürlich jede Tabelle mit PrimaryKey und jeder PrimKey muss sozusagen weltweit eindeutig sein. Also (LocationID,Key) und die LocationID muss beim ersten Start der SW erzeugt werden. GUID zum Beispiel. Dann sollte Zusammenühren von mehreren Datenbanken kein Problem sein, oder?
    Dabei ergibt sich dann, dass die ID aus a) auch weltweit eindeutig sein muss.

    Habt ihr Hinweise?

    Danke
    jenz



  • Ich verstehe zwar nicht wo das Problem ist aber:

    GUID ist schon mal richtig. Global eindeutig

    Den Rest macht man mit Triggern in eine Tabelle.
    Keine Rechte für User zum Löschen oder ändern.
    Nur die DB darf das.

    Zusammenführen ist noch einfacher.
    Einfach einspielen.



  • Ja, ich sehe da auch keine großen Probleme.
    Ich suche vor allem Informationen wie man es am besten macht.

    Zum Beispiel mache ich mir über folgendes Gedanken:
    Es werden ja immer nur neue Datensätze mit einer höheren Version eingetragen.
    Bei einem Select muss ich mir dann immer den Datensatz mit der höchsten Version ausgeben lassen. Kann bzw. sollte man wahrscheinlich durch eine View verstecken.
    Aber ich denke, dass es besser ist, wenn man in den alten Datensätzen noch eine Flagge hat, dadurch wird der select einfacher.

    Also:

    select * from <table> where alter_datensatz = 0;
    gegenüber
    select * from <table> a where version = (select max(version) from <table> b where a.object = b.object);

    Da muss sich doch schon mal jemand gedanken drüber gemacht haben.

    jenz



  • Naja alte versionen werden archiviert oder nicht? Flag würde ich schon nehmen.



  • Du kannst alte Datensätze in eigenen Tables ablegen. Dadurch wird das SELECT noch einfacher, und vor allem performanter.



  • Ja, das ist wahrscheinlich gar nicht schlecht, wenn man mit extra Tabellen arbeitet.

    Das meine ich, da muss es doch irgendwo etwas zu lesen geben.
    Ich weiß nur nicht, wie ich suchen muss.

    Oder gibt es da einfach nicht so viel zu beachten?

    jenz


Anmelden zum Antworten