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 DBlinetra); Organisationskonto{slug}_edit/{slug}_read. Web an der Org:admin(Mitarbeiter + Projekte),editor(Stamm + GIS),reader; pluscustomer,authority,foreman. Control-Katalog:tenants(UI „Organisation“),app_users.tenant_id(ADR-0031, ADR-0032). - Value Relations in QGIS: Org-Stamm und Projektkopien (
persons/organizationsmitproject_id-Filter). GIS-Layer filtern aufgeo_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).