Skip to content

Schema (Überblick)

Kern-Stammdaten (Schema public):

Tabelle Rolle
organizations Akteur Firma/Gemeinde (Debitor); project_id NULL = Org-Stamm, gesetzt = Projektkopie (ADR-0034)
persons Personen; given_name / family_name + Anzeige full_name; analog project_id / source_person_id
person_organization_memberships M:N Person ↔ Organisation; is_primary_contact für Kontaktperson
projects Projekte; period_from / period_to; optional municipality_org_id → Gemeinde-Organisation; Systemfelder siehe ADR-0040; optionale Org-Felder in metadata_json.attrs
geo_object_kinds Produkt-Stamm / Kind-Registry der Org; kein project_id (QGIS Value Relations)
geo_objects GIS-Stamm (kind aus dem Projektschema, geometry(Geometry,25832), GIST); project_id NOT NULL; attrs JSONB (CMS-Felder); stage / version_id nullable leftover, not written
map_layer_colors Hex-Farben für Produktarten (kind); Editor und Dashboard-Karte
geo_object_* Beilagen 1:1 Fachfelder (fiber_route, tkg, vao, crossing, …)
geo_object_revisions Versionen (Sidecar; Tiles lesen nur current)
project_versions / project_version_members Benannte Planungs-Freezes; Member pinnt revision_id
map_layers.parent_layer_id Nested Planungs-Layergruppen im Editor
route_sections / section_orders Kompat: lineare Abschnitte; SSOT ist work_sections
kind_packs / kind_pack_members / project_kind_packs Vertikale (Glasfaser, Verkehrszeichen, …)
work_sections Generischer Bauabschnitt (geom 25832, optionale Linearref)
approval_procedures Genehmigungsantrag (Statuskette)
procedure_conditions / condition_types Auflagen
procedure_events Audit-Sidecar (Tiles lesen das nicht)
jurisdictions Behörden-Gebietspolygon 25832
notifications In-App-Inbox bei Statuswechsel
execution_reports / execution_photos Bauleiter-Fortschritt
source_files Rohinput und Feld-Fotos auf Volume, nicht bytea; stage leftover nullable
qgis_<kind> Schreibbare View je Blatt-Layer (getypte geom, flache Felder, INSTEAD OF → geo_objects) (ADR-0049); die alte Sonder-View fiber_routes ist weg (ADR-0050)
qgis_layer_views Registry der generierten Views (kind_code, view_name, columns_hash)
schema_definitions Benanntes Schema (Standard global, jedes Projekt mindestens eines, weitere nur projektgebunden) (ADR-0047, ADR-0037)
entity_kinds / field_definitions / entity_records / entity_files Schema-CMS (ADR-0025); schema_code (Kinds und Felder); instantiation_scope base|project; is_federated nur Standard-Datensatz (ADR-0043); management_tab / API entity_type ∈ dataset|group|layer; Layer: geom_kind; parent_code typisiert (ADR-0045); Felder: cardinality n oder 1–99, required; list_code auf Auswahlliste (ADR-0042); Relation: config.target_kind; Records: project_id NULL = Zentrale bzw. föderierter Pool
project_schema_kinds / project_schema_fields Logisches Projektschema (Bindings, nicht physische DB) (ADR-0033)
catalog_checkouts / checkout_* Exklusiver Schema-Entwurf; Apply publiziert auf die Live-Tabellen (ADR-0046)
sync_conflicts Bidirektionaler Katalog-Sync, Inbox (ADR-0034)
import_mapping_profiles Pro-Projekt Mapping für Planer→Agent-GIS-Import (ADR-0026)
source_files.inspect_json Cache der GDAL-Layer-Inspektion

Schema-CMS

Zentrum ist das benannte Schema (schema_definitions); Kinds spezialisieren darin. Typ ist entity_type (dataset / group / layer) (ADR-0045). Gruppen nesten; Layer und Datensätze haben eine Vererbungsstufe; Layer-Eltern sind Schablonen. Blatt-Layer liegen in Gruppen über group_codes (ADR-0048); Eltern-Layer nicht. Ein Standard-Datensatz kann föderiert sein. Gruppen haben keine Katalogfelder (nur Bezeichnung, ID, Typ, Scope). Jedes Feld hat Kardinalität und Pflicht. Löschen im Standard: ADR-0038. Schema-Writes gehen in den Checkout-Entwurf (checkout_*); QGIS und Datensätze lesen die veröffentlichten Tabellen bis Anwenden (ADR-0046).

geo_objects (Geo-SSOT)

Fiber-Route ist eine kind aus dem Schema-Katalog. Der Layerbaum kommt aus Gruppen und Blatt-Layern, nicht aus Pipeline-Stufen. Neue kind: Registry + optionale Beilage, dieselbe MVT-Familie.

Vertrag der Webkarte ist GET /map/tiles/{path}/{z}/{x}/{y}.mvt ({path} ignoriert; Filter über kind). QGIS schreibt qgis_<kind>, nicht fiber_routes.

Konventionen

  • Geo: SRID 25832 (Speicher); Webkarte zeigt WGS84.
  • App-Rollen: Control linetra_edit / linetra_read (nur DB linetra); Organisationskonto {slug}_edit / {slug}_read. Web an der Org: admin (Mitarbeiter + Projekte), editor (Stamm + GIS), reader; plus customer, authority, foreman. Control-Katalog: tenants (UI „Organisation“), app_users.tenant_id (ADR-0031, ADR-0032).
  • Value Relations in QGIS: Org-Stamm und Projektkopien (persons / organizations mit project_id-Filter). GIS-Layer filtern auf geo_objects.project_id.

SQL-Hilfen

Datei Zweck
scripts/sql/02_qgis_form_support.sql Form-/Style-Unterstützung
scripts/sql/03_praxistest_stammdaten.sql Org→Person→Projekt Test
scripts/sql/04_create_app_roles.sql App-Rollen

ER: Datensatz · Gruppe · Layer

Live auf Datenmanagement → Schemata → {Schema}: Schalter Entitäten (Start, /datenmanagement/schemata/{code}/entitaeten) | ER-Diagramm (…/{code}/er). Das Diagramm: Tabellenkarten (Kopf in Typfarbe, Relationsfelder als Zeilen), referenzierte Tabellen in der nächsten Spalte, orthogonale Kanten in der Gasse, Kardinalität n oder 1–99 an den Enden, Pflicht rot, Vererbung (parent_code) gestrichelt. API: GET /schema-definitions/{code}/er.

flowchart LR
  classDef dataset fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
  classDef group fill:#fef3c7,stroke:#d97706,color:#78350f
  classDef layer fill:#ede9fe,stroke:#7c3aed,color:#4c1d95
  actor[Akteur]:::dataset
  assignment[Akteurszuweisung]:::dataset
  project[Projekt]:::dataset
  groupKind[Gruppe]:::group
  layerKind[Layer]:::layer
  assignment -->|"1 Pflicht"| actor
  assignment -.->|"1"| project
  project -.->|"n"| actor
  layerKind -.->|liegt in| groupKind

Rot / durchgezogen = Pflicht-Relation (required). Grau / gestrichelt = optional oder Vererbung. Typfarben: Datensatz (blau), Gruppe (amber), Layer (violett).