Skip to content

ADR-0038: Catalog delete retain vs cascade

  • Status: accepted
  • Datum: 2026-09-01
  • Phase: Web Schema-CMS
  • Bezug: ADR-0037, ADR-0033

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

  1. Standard-Schema zeigt keinen Scope (immer Global). Nur ein Projektschema setzt Scope; Global wandert zurück ins Standard-Schema.
  2. Löschen einer globalen Entität oder eines globalen Feldes im Standard fragt behalten oder überall löschen.
  3. Behalten (?retain_in_projects=true): instantiation_scope wird project, der Kind-code bleibt (GIS). Bindings bestehender Projekte werden origin=project. Neue Projekte und neue Schemata bekommen die Definition nicht (kein Basiseintrag mehr).
  4. Ü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} und DELETE /entity-kinds/{code}/fields/{field_id} akzeptieren retain_in_projects.
  • Standard-UI blendet Scope aus; Bestätigungsdialog trägt die zwei Optionen.