ADR-0038: Catalog delete retain vs cascade
Kontext
Ein Projektschema ist eine logische Kopie des Standard-Schemas (gleiche Kind-Codes, keine Duplikate). Ein hartes Löschen im Standard entfernt die gemeinsame Zeile — jede Projektansicht verliert die Entität oder das Feld. Nutzer brauchen beim Löschen aus dem Katalog eine Wahl: überall entfernen oder in bestehenden Projekten als projektspezifisch behalten. Scope ist im Standard immer Global und dort kein Wahlfeld.
Entscheidung
- Standard-Schema zeigt keinen Scope (immer Global). Nur ein Projektschema setzt Scope; Global wandert zurück ins Standard-Schema.
- Löschen einer globalen Entität oder eines globalen Feldes im Standard fragt behalten oder überall löschen.
- Behalten (
?retain_in_projects=true):instantiation_scopewirdproject, der Kind-codebleibt (GIS). Bindings bestehender Projekte werdenorigin=project. Neue Projekte und neue Schemata bekommen die Definition nicht (kein Basiseintrag mehr). - Überall löschen (Default der API ohne Flag): harte Zeile, wie bisher — Felder/Records/Bindings fallen per FK.
Begründung (für dieses Setup)
Kind-Codes bleiben organisationsweit eindeutig. Physische Kopien pro Schema würden geo_objects.kind und Records umschreiben. Demotion plus Bindings hält den Code, nimmt die Definition aus dem Katalog und lässt bestehende Projektschemata sie als Projekt-Scope weitersehen.
Verworfene Alternativen
| Alternative | Warum verworfen |
|---|---|
| Immer hart löschen | Projekte verlieren die Definition ohne Nachfrage |
| Physische Kind-Duplikate pro Schema | Bricht org-weit eindeutige Kind-Codes |
Behalten ohne Bindings (standard + project überall sichtbar) |
Neue Schemata würden die Definition wiedererben |
| Scope-Wahl auch im Standard | Scope ist dort immer Global |
Folgen
DELETE /entity-kinds/{code}undDELETE /entity-kinds/{code}/fields/{field_id}akzeptierenretain_in_projects.- Standard-UI blendet Scope aus; Bestätigungsdialog trägt die zwei Optionen.