ADR-0041: One-level kind hierarchy and abstract parents
Kontext
Kinds können über parent_code Felder erben (ADR-0028, max. Tiefe 8). Die Web-UI hat das nicht angeboten. Nutzer brauchen Sub-Entitäten in genau einem Schritt — z. B. Akteur → Person / Organisation, Produkt → Querung / VAO — ohne Enkel und ohne Datensätze am Elternteil.
Entscheidung
- Genau eine Stufe: ein Kind darf nur eine Wurzel als Elternteil haben. Enkel → 400.
- Abstrakt ab dem ersten Kind:
is_abstractin der API ist abgeleitet (hat Kinder). Das Elternteil hält Felder; Records und GIS-Inserts darauf → 403. Ein Kind anlegen, während das Elternteil schon Records odergeo_objectshat, verlangt Transfer oder Löschen (ADR-0044; früher 409 ohne Wahl). - Felder bleiben beim Elternteil; Kinder sehen sie als
inherited/defined_on(unverändert ADR-0028). Kein Kopieren, kein Override. - UI: Hover über eine Wurzel-Entität fährt Kind anlegen aus; Kinder in der Liste eingerückt. Datensätze nur auf Blatt-Kinds.
- Typ vom Elternteil: ein Kind hat immer denselben
management_tabwie die Wurzel und kann ihn nicht selbst ändern. Wechselt das Elternteil den Typ, ziehen die Kinder mit. Abweichung beim Anlegen oder Ändern des Kindes → 400. Kind eines Projekt-Elternteils nur Projekt; globales Kind unter Projekt-Elternteil → 400. - Seed-Akteur bleibt eine flache Entität mit Typ-Enum. Promote (ADR-0028) bleibt die Ausnahme: es erzeugt ein Layer-/Feature-Kind unter einem Datenobjekt.
| Gate | Recommendation | Why it fits here | Rejected alternative and why |
|---|---|---|---|
| Tiefe | Hart eine Stufe | Passt zum Bedienweg; ER und QGIS bleiben flach | Tiefe 8 belassen — versteckte Hierarchien |
| Abstrakt | Abgeleitet aus Kinderzahl | Keine Extra-Spalte, kein Drift | Explizites is_abstract — zwei Wahrheiten |
| Anlegen | Hover auf der Zeile, dann Kind anlegen | Kind gehört zur Entität, nicht zum allgemeinen + |
Dauerhaftes ↳ / Elternteil-Select |
| Typ | Identisch zum Elternteil; Wechsel nur dort, dann Kaskade | Feature-Kinder bleiben Features; eine Quelle der Wahrheit | Freier Kind-Typ oder Eltern-Typ einfrieren |
Begründung (für dieses Setup)
Wenige Kinds pro Organisation; Resolve-on-read bleibt billig. Records bleiben auf entity_records.kind_code der Blätter. Das abstrakte Elternteil ist die Produkt-Vorlage, die Kinder die konkreten Kinds.
Verworfene Alternativen
| Alternative | Warum verworfen |
|---|---|
| Tiefe 8 weiter erlauben | Nutzer wollen einen Schritt; Enkel erschweren Bindings und GIS |
| Feldkopie aufs Kind | Drift gegen ADR-0028 |
| Seed-Akteur jetzt aufbrechen | Hybrid/QGIS unberührt lassen; der Mechanismus gilt für neue Kinds |
| Elternteil-Select im Anlege-Dialog | Kind gehört zur Zeile; + legt nur Wurzeln an |
Dauerhaftes ↳ auf jeder Wurzel |
Hover hält die Liste ruhig; Touch zeigt den Text weiter |
| Kind-Typ frei wählbar | Kinder sind Spezialisierungen, keine Umwidmung; Promote bleibt der GIS-Weg |
| Eltern-Typ nach Kindern einfrieren | Typ gehört zur Vorlage; Wechsel am Elternteil aktualisiert die Kinder |
Folgen
_MAX_KIND_DEPTH = 2inschema_cms.service;EntityKindOut.is_abstract.- Keine Alembic-Migration.
- ADR-0028 bleibt accepted; die dortige Tiefe 8 ist durch diese ADR ersetzt.