Skip to content

ADR-0049: Schreibbare QGIS-Views pro Blatt-Layer

Kontext

QGIS lädt einen Vektorlayer als eine Geometrieart + Attributtabelle (getypte Spalten, Primärschlüssel, Filter). Schema-CMS speichert Features in geo_objects (geometry(Geometry, 25832) + attrs JSONB). Ohne Projektion sieht das Plugin nur einen JSON-Blob — keine native Attributtabelle, keine Digitize-Defaults, kein Value-Relation auf Fachfeldern. fiber_routes ist genau diese Projektion, aber nur für eine Kind.

Entscheidung

  1. Eine View pro veröffentlichtem Blatt-Layer: public.qgis_<kind_code> (bei langen IDs gekürzt + Hash). Eltern mit Kindern bekommen keine View.
  2. Systemspalten (stabil fürs Plugin): object_id (Key), project_id (Subset-Filter), label, status, geom getypt Point / LineString / Polygon SRID 25832, created_at, updated_at.
  3. Fachfelder aus dem effektiven Katalog (inkl. Vererbung) als flache Spalten. Kardinalität 1 → Skalar; n / 2–99 → Array; groupjsonb. Kollision mit Systemnamen → Spalte f_<code> (Attrs-Key bleibt der Feldcode).
  4. INSTEAD OF INSERT/UPDATE/DELETE schreiben zurück nach geo_objects (kind / geom_kind fest, stage ungesetzt, attrs gemerged). Bestehende JSONB-Keys außerhalb der View bleiben erhalten.
  5. Rebuild beim Veröffentlichen des Checkouts und bei Live-Writes auf den veröffentlichten Katalog. GET /qgis/layers?project_id= ist der Plugin-Apply-Vertrag (Gruppen + Blatt-Layer + View-Name + Spaltenmap). Draft-Views gibt es nicht.
  6. Rechte: GRANT an Login-Rollen, die schon geo_objects lesen bzw. schreiben (deckt linetra_edit / linetra_read und {slug}_edit / {slug}_read).
Gate Recommendation Why it fits here Rejected alternative and why
Projektion View + INSTEAD OF, eine Hot-Tabelle QGIS-Provider; ADR-0010 bleibt SSOT Tabelle pro Layer — Drift, GIST×N
Zeitpunkt Apply + Live-Write; GET heilt Drift Plugin lädt nach Migrate ohne Extra-Schritt Nur Alembic-Snapshot — Felder danach tot
Vertrag GET /qgis/layers Plugin braucht View, Typ, Key, Gruppen, Spaltenmap Plugin rät qgis_<code> und JSONB
n-Felder Postgres-Array Daten bleiben editierbar Nur JSONB — Attributtabelle bleibt Blob

Begründung (für dieses Setup)

Branchenüblich ist eine schreibbare PostGIS-View (oder Wrapper) pro QGIS-Ebene über einem generischen Feature-Stamm. Views skalieren mit der Kataloggröße, nicht mit der Feature-Zahl. Das Plugin setzt project_id auf der View und Formulare aus der Spaltenmap.

Verworfene Alternativen

Alternative Warum verworfen
Plugin schreibt JSONB direkt auf geo_objects Keine native Attributtabelle; Digitize bricht
DDL-Spalten an geo_objects Mega-Tabelle; widerspricht ADR-0010
Eine View qgis_geo_objects mit kind-Filter nur im Plugin Generic Geometry; QGIS editiert kein mixed
fiber_routes ersetzen Erledigt in ADR-0050; Vertrag ist qgis_*

Folgen

  • Alembic public 0027 / tenant 0015: Hilfsfunktionen, Registry qgis_layer_views.
  • API: GET /api/v1/qgis/layers.
  • Plugin-Apply liest den Katalog und hängt qgis_* mit key=object_id, type aus geom_kind, Filter project_id.
  • fiber_routes ist entfernt (ADR-0050).