Skip to content

ADR-0042: Named selection lists for enum and list fields

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

Kontext

enum und list waren zwei Feldtypen mit eigenen config.options. Kardinalität steht jetzt getrennt (n oder 1–99). Nutzer erwarten: ein Wert aus einer Liste ist enum, mehrere Werte aus derselben Art Liste ist list. Die Werte selbst gehören in eine wiederverwendbare Auswahlliste, nicht in jedes Feld.

Entscheidung

  1. Produkt ist die Liste. Tabelle selection_lists (code, label); Einträge in selection_list_entries (value = Key, label = Wert, sort_order). Der Key folgt derselben Serialisierung wie IDs (^[a-z][a-z0-9_]*$), ist pro Liste eindeutig und per Stift setzbar. Kein zweites Zentrum.
  2. enum = Kardinalität 1. list ohne item_type: group = Kardinalität n oder 2–99. Typ und Kardinalität gleichen sich beim Schreiben an.
  3. Jedes solche Feld hat field_definitions.list_code (FK, ON DELETE RESTRICT). Anlegen ohne Liste → 400. Verschachtelte list + group (Akteurszuweisung) bleibt ohne Liste.
  4. UI: zuerst Kardinalität, dann Feldtyp, dann Auswahlliste (Dropdown, + / / ×). config.options kommt zur Laufzeit aus der Liste (Validierung, QGIS).
  5. Bestehende enum-Felder werden nach {kind_code}_{field_code} migriert.
Gate Recommendation Why it fits here Rejected alternative and why
Modell eigene Listen-Tabelle Wiederverwendbar, eine Pflege Options nur in config JSON — Drift pro Feld
Typ enum/list folgen der Kardinalität Ein Bedienweg, keine doppelte Semantik Zwei unabhängige Typen plus Kardinalität
Löschen RESTRICT solange ein Feld bindet Kein stilles Leeren von Masken CASCADE — Felder ohne Werte

Begründung (für dieses Setup)

Fachmodelle teilen Status-, Art- und Tag-Listen. Wenige Listen pro Organisation; Resolve-on-read in _field_dicts bleibt billig. Nested Groups bleiben das andere list-Modell (ADR-0039).

Verworfene Alternativen

Alternative Warum verworfen
Options nur im Feld-config Keine Wiederverwendung, Dialog ohne Auswahlliste
Enum und List als getrennte Kataloge Dieselbe Werteliste, nur die Anzahl unterscheidet
Liste als Kind von entity_kinds Keine Records, kein GIS — anderes Produkt

Folgen

  • Alembic 0019_selection_lists / Tenant 0007_selection_lists.
  • API GET/POST /selection-lists, GET/PUT/DELETE /selection-lists/{code}; FieldDefinitionIn/Out.list_code.
  • Plugin bleibt apply-only; Formulare lesen config.options wie bisher.