wiki/mandates/pek/datenmodell/PEK Datenmodell.md
ValueOn AG 15f0e51bd0 pek
2025-10-24 21:42:47 +02:00

20 KiB

Datenmodell Architektur-Planungs-App

Übersicht

Dieses Datenmodell bildet die Grundlage für eine Schweizer Architektur-Planungs-App zur Verwaltung von Bauprojekten, Parzellen, Dokumenten und regulatorischen Kontextinformationen.

Datenfluss-Diagramm

---
title: Hauptflüsse - Architektur-Planungs-App
---
flowchart TD
    Start([Datenmodell Start])
    
    subgraph Admin[Administrative Ebene]
        Land[LAND<br/>Schweiz]
        Kanton[KANTON<br/>z.B. Zürich]
        Gemeinde[GEMEINDE<br/>z.B. Zürich Stadt]
        Land --> Kanton
        Kanton --> Gemeinde
    end
    
    subgraph Geo[Geografische Daten]
        Parzelle[PARZELLE<br/>Grundstück mit<br/>Bauparametern]
        GeoPunkt[GEO_PUNKT<br/>Koordinaten]
        Gemeinde --> Parzelle
        Parzelle --> GeoPunkt
    end
    
    subgraph Core[Kern-Business-Logik]
        Projekt[PROJEKT<br/>Bauprojekt]
        Dokument[DOKUMENT<br/>Dateien & URLs]
        Projekt -.Perimeter.-> Parzelle
        Projekt -.Dokumente.-> Dokument
        Parzelle -.Dokumente.-> Dokument
    end
    
    subgraph Support[Unterstützende Daten]
        Kontext[KONTEXT<br/>Zusatzinfos]
        Projekt --> Kontext
        Parzelle --> Kontext
    end
    
    Start --> Admin
    
    style Land fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
    style Kanton fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
    style Gemeinde fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
    style Parzelle fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
    style Projekt fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
    style Dokument fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
    style GeoPunkt fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff
    style Kontext fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff

Alle Datenobjekte als Tabellen

Übersichtstabelle

Objekt Typ Beschreibung Hauptfelder
Projekt Hauptentität Bauprojekt mit Status und Perimeter id, label, statusProzess
Parzelle Hauptentität Grundstück mit Bauparametern id, label, bauzone, AZ, BZ
Dokument Hauptentität Dateien und URLs mit Versionierung id, label, typ, format
Land Admin Nationale Ebene id, label
Kanton Admin Kantonale Ebene mit Baurecht id, label, Baureglement
Gemeinde Admin Gemeinde-Ebene mit BZO id, label, plz, BZO
GeoPunkt Hilfsobjekt 3D-Koordinate im LV95 x, y, z, referenzen
Kontext Hilfsobjekt Flexible Zusatzinformationen id, thema, inhalt
Tag Enum Dokumentkategorien -
GeoTag Enum Geopunkt-Kategorien -
JaNein Enum Drei-wertiger Status "", "Ja", "Nein"
StatusProzess Enum Projektstatus 7 Werte

Zentrale Entitäten

1. Projekt

Das Kernobjekt, das ein Bauprojekt repräsentiert.

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Projektbezeichnung
statusProzess Array[Enum] - Projektstatus: Eingang, Analyse, Studie, Planung, Baurechtsverfahren, Umsetzung, Archiv
perimeter Array[Parzelle] - Betroffene Parzellen (n:m Beziehung)
dokumenteBauherrschaft Array[Dokument] - Dokumente vom Bauherrn (n:m Beziehung)
dokumentePlanung Array[Dokument] - Planungsdokumente (n:m Beziehung)
geoBaulinie Array[GeoPunkt] - Baulinie als Polygonzug (1:n Beziehung)
kontextInformationen Array[Kontext] - Projektspezifische Kontextinfos (1:n Beziehung)

Beziehungen:

  • n:m zu Parzelle (Perimeter über projekt_parzelle)
  • n:m zu Dokument (Bauherrschaft über projekt_dokument_bauherrschaft)
  • n:m zu Dokument (Planung über projekt_dokument_planung)
  • 1:n zu GeoPunkt (Baulinie)
  • 1:n zu Kontext

2. Parzelle

Repräsentiert ein Grundstück mit allen baurechtlichen Eigenschaften.

Grunddaten

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Parzellenbezeichnung
parzellenNummern Array[String] - Offizielle Parzellennummern
eigentuemerschaaft String - Eigentümer der Parzelle
strasseNr String - Straße und Hausnummer

Geografischer Kontext

Feld Datentyp Pflicht Beschreibung
kontextLand Land - Land der Parzelle (n:1 Beziehung)
kontextKanton Kanton - Kanton der Parzelle (n:1 Beziehung)
kontextGemeinde Gemeinde - Gemeinde der Parzelle (n:1 Beziehung)
geoUmfang Array[GeoPunkt] - Parzellengrenze als Polygon

Nachbarschaft

Feld Datentyp Pflicht Beschreibung
nachbarEigentuemer Array[Parzelle] - Selbstreferenz zu angrenzenden Parzellen (n:m Beziehung)

Schutzzonen

Feld Datentyp Pflicht Beschreibung
hochwasserschutzzone String - Hochwasserschutzzone (falls zutreffend)
laermschutzzone String - Lärmschutzzone
grundwasserschutzzone String - Grundwasserschutzzone (falls zutreffend)

Bebauungsparameter

Feld Datentyp Pflicht Beschreibung
bauzone String - Bauzonenbezeichnung (z.B. W3, WG2, etc.)
az Float - Ausnützungsziffer
bz Float - Bebauungsziffer
vollgeschossZahl Integer - Anzahl zulässiger Vollgeschosse
anrechenbarDachgeschoss Float - Anrechenbarer Anteil Dachgeschoss (0.0 - 1.0)
anrechenbarUntergeschoss Float - Anrechenbarer Anteil Untergeschoss (0.0 - 1.0)
gebaeudehoehe_max Float - Maximale Gebäudehöhe in Metern

Abstandsregelungen

Feld Datentyp Pflicht Beschreibung
regelnGrenzabstand String - Regelungen zum Grenzabstand
regelnMehrlaengenzuschlag String - Regelungen zum Mehrlängenzuschlag
regelnMehrhoehenzuschlag String - Regelungen zum Mehrhöhenzuschlag

Eigenschaften (Ja/Nein)

Feld Datentyp Pflicht Beschreibung
parzelleBebaut JaNein - Ist die Parzelle bebaut? ("", "Ja", "Nein")
parzelleErschlossen JaNein - Ist die Parzelle erschlossen? ("", "Ja", "Nein")
hanglage JaNein - Liegt die Parzelle in Hanglage? ("", "Ja", "Nein")

Weitere Informationen

Feld Datentyp Pflicht Beschreibung
spezifischeDokumente Array[Dokument] - Parzellenspezifische Dokumente (n:m Beziehung)
kontextInformationen Array[Kontext] - Parzellenspezifische Kontextinfos (1:n Beziehung)

Beziehungen:

  • n:1 zu Land, Kanton, Gemeinde (geografischer Kontext)
  • n:m zu Parzelle (Nachbarn über parzelle_nachbar)
  • n:m zu Dokument (über parzelle_dokument)
  • 1:n zu GeoPunkt (Umfang als Polygon)
  • 1:n zu Kontext

3. Dokument

Verwaltet Dateien und URLs mit Versionierung.

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Dokumentbezeichnung
versionsbezeichnung String - Versionsnummer oder -bezeichnung (z.B. "v1.0", "Rev. A")
typ Enum Art des Dokuments: Datei oder Url
format String - Dateiformat (z.B. "PDF", "DWG", "IFC", "URL")
dokumentReferenz String Dateipfad oder URL
tags Array[Tag] - Kategorisierung (siehe Tag-Enum)

Tag-Enum (Dokumentkategorien)

Tag Beschreibung
Kataster Objekte Amtliche Vermessung
Kataster Werkeleitungen Leitungskataster
Kataster Belastete Standorte Altlasten
Kataster Bäume Baumkataster
Zonenplan Zonenpläne
Planungs- und Baugesetz (PGB) Kantonale Baugesetze
Bau- und Zonenordnung (BZO) Gemeinde BZO
Parkplatzverordnung Parkplatzregelungen
Eigentümerauskunft Grundbuch-Auszüge Eigentümer
Grundbuchauszug Vollständige Grundbuch-Auszüge

Beziehungen:

  • n:m zu allen Entitäten, die Dokumente referenzieren (Projekt, Parzelle, Land, Kanton, Gemeinde)

4. Geografische Entitäten

GeoPunkt

Repräsentiert einen 3D-Punkt im Schweizer Koordinatensystem LV95 (EPSG:2056).

Feld Datentyp Pflicht Beschreibung
x Float LV95 Ostwert (E), typisch 2'480'000 - 2'840'000
y Float LV95 Nordwert (N), typisch 1'070'000 - 1'300'000
z Float - Höhe über Meer in Metern
referenzen Array[GeoTag] - Kategorisierung des Punktes

Verwendung:

  • Parzellenumfang (Polygon)
  • Baulinie (Linienzug)
  • Einzelne Referenzpunkte

GeoTag (Enum)

Kategorie Beschreibung
Referenzpunkt Kat. 1 Fixpunkt höchster Genauigkeit
Referenzpunkt Kat. 2 Fixpunkt mittlerer Genauigkeit
Referenzpunkt Kat. 3 Fixpunkt niedriger Genauigkeit
Geometeraufnahme Vom Geometer vermessener Punkt

Koordinatensystem-Beispiel (Zürich Hauptbahnhof):

  • X (Ost): 2'683'140
  • Y (Nord): 1'247'850
  • Z (Höhe): 408 m ü. M.

5. Administrative Hierarchie

Land

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Landesname (z.B. "Schweiz")
dokumente Array[Dokument] - Nationale Gesetze (1:n Beziehung)
kontextInformationen Array[Kontext] - Nationale Kontextinformationen (1:n Beziehung)

Beziehungen:

  • 1:n zu Kanton

Kanton

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Kantonsname (z.B. "Zürich")
dokumente Array[Dokument] - Kantonale Dokumente (1:n Beziehung)
kontextInformationen Array[Kontext] - Kantonsspezifische Kontextinfos (1:n Beziehung)
baureglementAktuell Dokument - Aktuelles Baureglement
baureglementRevision Dokument - Baureglement in Revision
bauverordnungAktuell Dokument - Aktuelle Bauverordnung
bauverordnungRevision Dokument - Bauverordnung in Revision

Beziehungen:

  • n:1 zu Land
  • 1:n zu Gemeinde

Gemeinde

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
label String Gemeindename (z.B. "Zürich")
plz String - Postleitzahl
dokumente Array[Dokument] - Gemeindedokumente (1:n Beziehung)
kontextInformationen Array[Kontext] - Gemeindespezifische Kontextinfos (1:n Beziehung)
bzoAktuell Dokument - Aktuelle Bau- und Zonenordnung (BZO)
bzoRevision Dokument - BZO in Revision

Beziehungen:

  • n:1 zu Kanton
  • 1:n zu Parzelle

6. Kontext

Flexibles System für spezifische Informationen und Hinweise.

Feld Datentyp Pflicht Beschreibung
id UUID Eindeutiger Identifier
thema String Bezeichnung des Themas
inhalt String Detaillierte Information (Text)

Polymorphe Beziehung - Kontext kann gehören zu:

  • Projekt (n:1)
  • Parzelle (n:1)
  • Land (n:1)
  • Kanton (n:1)
  • Gemeinde (n:1)

Beispielthemen (nicht abschliessend)

Themenbereich Beispiele
Nutzung Vorgaben zur Erdgeschossnutzung (Wohnen erlaubt oder Pflicht für Gewerbe)
Rechte Dienstbarkeiten (Wegrechte, Nähebaurechte, etc.)
Parkierung Anforderung Parkplätze (Berechnung / Reduktionsfaktoren)
Ausnützung Ausnützungsübertragungen
Umwelt Schadstoffbelastungen auf Parzellen
Planung Aktive Gestaltungspläne
Lärm Lärmempfindlichkeitsstufen
Energie Mögliche Wärmenutzung (Wärmeverbundnetze; Fernwärme, Anergie)
Natur Baumbestand auf privaten Grundstücken
Schutz Isos (Ortsbild, Schutzstatus, Denkmalschutz, Weilergebiet, etc.)
Gefahren Naturgefahren (z.B. Objektschutzmassnahmen (Hochwasser))
Revision Verweis auf aktuell in oder zukünftig in Revision befindlichen Normen/Gesetze (z.B. Revision PBG mit aktuell negativer Vorwirkung)

Design-Rationale:
Das Kontext-Objekt ermöglicht flexibles Hinzufügen von projektspezifischen, parzellen-spezifischen oder regionalen Informationen ohne Schemaänderungen.


7. Hilfsentitäten & Enumerationen

JaNein (Enum)

Drei-wertiger Zustand für optionale Ja/Nein-Fragen.

Wert Bedeutung
"" (leer) Unbekannt / Nicht erfasst
"Ja" Ja / Zutreffend
"Nein" Nein / Nicht zutreffend

Verwendung:

  • parzelleBebaut: Ist die Parzelle bebaut?
  • parzelleErschlossen: Ist die Parzelle erschlossen?
  • hanglage: Liegt die Parzelle in Hanglage?

StatusProzess (Enum)

Projektstatus zur Nachverfolgung des Projektfortschritts.

Wert Beschreibung
Eingang Projekt wurde eingereicht
Analyse Projekt wird analysiert
Studie Machbarkeitsstudie läuft
Planung Planungsphase
Baurechtsverfahren Baubewilligung läuft
Umsetzung Bauprojekt in Umsetzung
Archiv Projekt abgeschlossen

Besonderheit:
Ein Projekt kann mehrere Status gleichzeitig haben (z.B. "Analyse" und "Studie").


DokumentTyp (Enum)

Wert Beschreibung
Datei Physische Datei (PDF, DWG, etc.)
Url Externer Link / URL

Beziehungsdiagramm

PROJEKT
├── perimeter [1:n] ──────────> PARZELLE
│   ├── dokumenteBauherrschaft [1:n] ──> DOKUMENT
│   ├── dokumentePlanung [1:n] ────────> DOKUMENT
│   ├── geoBaulinie [1:n] ─────────────> GEO_PUNKT
│   └── kontextInformationen [1:n] ───> KONTEXT

PARZELLE
├── nachbarEigentuemer [n:n] ──> PARZELLE (selbst)
├── kontextLand [n:1] ──────────> LAND
├── kontextKanton [n:1] ────────> KANTON
├── kontextGemeinde [n:1] ──────> GEMEINDE
├── geoUmfang [1:n] ────────────> GEO_PUNKT
├── spezifischeDokumente [1:n] ─> DOKUMENT
└── kontextInformationen [1:n] ─> KONTEXT

DOKUMENT
└── tags [n:n] ─────────────────> TAG

GEO_PUNKT
└── referenzen [1:n] ───────────> GEO_TAG

LAND / KANTON / GEMEINDE
├── dokumente [1:n] ────────────> DOKUMENT
└── kontextInformationen [1:n] ─> KONTEXT

Junction Tables (Many-to-Many Beziehungen)

Zwischentabellen zur Auflösung von n:m Beziehungen:

Tabelle Verbindet Felder Beschreibung
projekt_parzelle Projekt ↔ Parzelle projekt_id, parzelle_id Projektperimeter
projekt_dokument_bauherrschaft Projekt ↔ Dokument projekt_id, dokument_id Dokumente der Bauherrschaft
projekt_dokument_planung Projekt ↔ Dokument projekt_id, dokument_id Planungsdokumente
parzelle_nachbar Parzelle ↔ Parzelle parzelle_id, nachbar_id Nachbarschaftsbeziehungen
parzelle_dokument Parzelle ↔ Dokument parzelle_id, dokument_id Parzellenspezifische Dokumente

Besonderheiten:

  • parzelle_nachbar: Selbstreferenzierende Tabelle mit Constraint parzelle_id != nachbar_id
  • Alle Junction Tables haben zusammengesetzte Primärschlüssel aus beiden Foreign Keys
  • CASCADE DELETE empfohlen für automatische Bereinigung

Implementierungshinweise

Datenbank-Design

Empfehlung: Hybrid-Ansatz

Relationale Datenbank (PostgreSQL mit PostGIS):

  • Stammdaten: Projekt, Parzelle, Land, Kanton, Gemeinde
  • Geografische Daten: GeoPunkt mit PostGIS-Geometrie-Typen
  • Strukturierte Queries und Joins

Dokumenten-Datenbank oder Blob Storage:

  • Dokumente: S3, Azure Blob Storage oder MinIO
  • Metadaten in relationaler DB, Binärdaten extern

Schema-Überlegungen

Normalisierung:

  1. Land, Kanton, Gemeinde als separate Tabellen mit Referenzen
  2. Dokument als zentrale Tabelle, referenziert von mehreren Entitäten (Polymorphic Associations oder Junction Tables)
  3. GeoPunkt entweder embedded (JSON) oder separate Tabelle mit Foreign Keys

Denormalisierung für Performance:

  • Häufig abgefragte Parzellendaten können gecached werden
  • Gemeinde.plz könnte redundant in Parzelle gespeichert werden

Geografische Daten

Koordinatensystem: Schweizer Landessystem LV95 (EPSG:2056):

  • X (Ost): 2'480'000 - 2'840'000
  • Y (Nord): 1'070'000 - 1'300'000
  • Z (Höhe): Meter über Meer

Validierung

Pflichtfelder:

  • Alle IDs (UUID)
  • Alle Labels
  • Dokument: typ, dokumentReferenz
  • GeoPunkt: x, y (z optional)
  • Kontext: thema, inhalt

Geschäftslogik-Validierungen:

  • AZ und BZ müssen > 0 sein
  • VollgeschossZahl muss ≥ 0 sein
  • Geo-Koordinaten müssen in gültigem CH-Bereich liegen
  • Parzelle muss mindestens 3 GeoPunkte für gültiges Polygon haben

Sicherheit & Zugriffskontrolle

Überlegungen:

  • Dokumente: Zugriffskontrolle nach Projekt-/Benutzerrolle
  • Eigentümerdaten: DSGVO-konforme Behandlung
  • Audit-Log für Änderungen an Bebauungsparametern
  • Versionierung von Dokumenten (via versionsbezeichnung)

Erweiterbarkeit

Flexible Bereiche:

  1. Kontext-Objekt: Neue Themen können ohne Schema-Änderung hinzugefügt werden
  2. Tag-System: Erweiterbar um neue Dokumentkategorien
  3. StatusProzess: Kann projektspezifisch angepasst werden
  4. GeoTag: Neue Kategorien für Vermessungspunkte möglich

Migration-Strategy:

  • Verwende Datenbank-Migrationen (z.B. Alembic für Python, Flyway für Java)
  • Behalte alte Enums bei, füge neue hinzu
  • Nutze nullable Felder für neue Eigenschaften

Anwendungsfälle

Use Case 1: Neues Projekt anlegen

  1. Erstelle Projekt mit Label und Status
  2. Füge Parzellen zum Perimeter hinzu
  3. Lade Dokumente der Bauherrschaft hoch
  4. Verknüpfe Kontext-Informationen

Use Case 2: Bebaubarkeit prüfen

  1. Lade Parzelle mit allen Eigenschaften
  2. Prüfe AZ, BZ, Vollgeschosszahl
  3. Berücksichtige Hanglage, Schutzzonen
  4. Lade BZO der Gemeinde
  5. Prüfe Kontext-Informationen (Dienstbarkeiten, etc.)

Use Case 3: Nachbaranalyse

  1. Lade Parzelle
  2. Folge nachbarEigentuemer-Referenzen
  3. Zeige Eigentümer und Bebauung der Nachbarparzellen

Use Case 4: Dokumentensuche

  1. Suche über Tags (z.B. "Zonenplan")
  2. Filtere nach Format (z.B. PDF)
  3. Gruppiere nach Projekt/Parzelle/Gemeinde

Use Case 5: Revisionen verfolgen

  1. Prüfe Gemeinde.bzoRevision
  2. Prüfe Kanton.baureglementRevision
  3. Erstelle Kontext-Eintrag mit Hinweis auf negative Vorwirkung

Offene Fragen / Zu klären

  1. Versionierung: Sollen Änderungen an Parzellen historisiert werden?
  2. Mehrsprachigkeit: Labels in DE/FR/IT?
  3. Benutzer & Rollen: Wer darf was bearbeiten?
  4. Workflow-Engine: Für Statusübergänge und Genehmigungen?
  5. Integration: Anbindung an amtliche Geodaten (z.B. Swisstopo API)?
  6. Berechnungen: Sollen Ausnützungsberechnungen automatisiert werden?

Nächste Schritte

  1. Validierung: Review mit PEK
  2. Prototyp: Implementierung der Datenmodell-Klassen
  3. GIS-Integration: PostGIS aufsetzen, Test-Geodaten importieren
  4. API-Design: RESTful API (FastAPI) mit OpenAPI-Dokumentation