This is an old revision of the document!
Es gab eine lange Suche nach dem richtigen Modell für die Projektstruktur. Das CAP Theorem sagt uns ja, dass man immer nur maximal 2 von 3 gewünschten Zielen erreichen kann: Konsistenz, Verfügbarkeit, Partitionstoleranz. In der Suche nach der optimalen Projektstruktur habe ich mich immer wieder im Kreis1) gedreht, weil mal die Konsistenz der Schwerpunkt der Analyse war, dann die Partitionstoleranz, dann die Verfügbarkeit.
Hier sind die Regeln, die eingehalten werden müssen, und die zur letztendlichen Struktur geführt haben:
Die Lösung wird im folgenden Bild dargestellt:
Was hat das auf sich? Relativ einfach:
Ein Hauptprojekt wird über 2 Aggregates angelegt. Man braucht dafür aber keinen Prozess. Einfach erst das Projekt anlegen, und wenn das geklappt hat, den PSP vom Typ Projekt mit einer Referenz auf das Projekt auf oberster Ebene in der Struktur anlegen. Erst dann ist das Projekt im Lesemodell sichtbar.
Das läuft genau wie die Anlage eines Hauptprojektes. Wenn z.B. ein Arbeitspaket im PSP angelegt werden soll, wird erst das Arbeitspaket Aggregate erzeugt, danach die Referenz darauf im PSP.
Auch das ist nicht weiter kompliziert. Hier sind 3 Aggregates betroffen. Angenommen es handelt sich um ein Teilprojekt, das als PSP komplett an einen Teilprojektleiter delegiert werden soll. Dann wird das Teilprojekt angelegt, das PSP vom Typ Teilprojekt, und dann wird das PSP im übergeordneten PSP referenziert. Ein Teilprojekt-PSP ist im Lesemodell auch nicht sichtbar wenn es nicht referenziert wird, d.h. es wird kein neues Hauptprojekt rum schweben, sollte der letzte Schritt fehlschlagen.
Angenommen in dem Beispiel soll Projekt 1.1.1 an einen Teilprojektleiter delegiert werden, obwohl es bereits als Teil des Haupt PSP 1 angelegt wurde. Man würde im ersten Schritt einen Teilprojekt-PSP für das Projekt 1.1.1 anlegen:
Im zweiten Schritt löscht man die ID-Referenzen auf Projekt 1.1.1 und Produkt 1.1.1.1 aus PSP 1 und legt eine neue Referenz auf das neue Teilprojekt PSP 1.1.1 an.
Auch hier gilt, dass das Ergebnis des ersten Schritts ohne den zweiten Schritt nicht sichtbar sein wird, weil das Teilprojekt PSP von niemanden referenziert wird. Daher ist auch das eine relativ einfache Umwandlung.
Falls ES5) eingesetzt wird, ist nicht sicher gestellt, dass die Ereignisse der Aggregates PSP 1 und dem neuen Aggregate Teilprojekt-PSP 1.1.1 in der gewünschten Reihenfolge beobachtet und denormalisiert werden. Das Lesemodell verwendet immer die Ereignisse aus den PSPs, gemeinsam mit denen der referenzierten Aggregates. Nur was in beiden existiert wird auch angezeigt. Was kann passieren?
Das Lesemodell erhält erst die Ereignisse, in denen die Umwandlung in PSP 1 geschieht, d.h. das entfernen der Referenz auf Projekt 1.1.1 und Produkt 1.1.1.1, sowie das Hinzufügen auf das Teilprojekt-PSP 1.1.1. Das Ergebnis wäre, dass die Teilprojekt Referenz ins Leere zeigt, also auch noch nicht im Lesemodell angezeigt wird, und dass Projekt 1.1.1 samt Produkt 1.1.1.1 nicht mehr referenziert werden, also nicht im Lesemodell enthalten sind. Es kann also passieren, dass die gewandelten Objekte vorübergehend verschwinden. Schließliche Konsistenz sagt uns aber, dass die Objekte schließlich wieder erscheinen, und zwar mit 100%er Sicherheit - nur nicht wie lange das dauern wird6)
Wenn der letzte Schritt wieder rückgängig gemacht werden soll, würde in PSP 1 in einem Schritt die Referenz auf das Teilprojekt PSP aufgelöst werden, und das Projekt 1.1.1 und das Produkt 1.1.1.1 als Referenz wieder zurück in die Struktur aufgenommen werden. Danach kann das Teilprojekt PSP gelöscht werden.
Auch hier kann es passieren, dass das Löschen von dem Teilprojekt PSP als erstes beobachtet wird, und dass das gewandelte Teilprojekt somit vorübergehend aus dem Lesemodell verschwindet.