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 Constraintparzelle_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:
- Land, Kanton, Gemeinde als separate Tabellen mit Referenzen
- Dokument als zentrale Tabelle, referenziert von mehreren Entitäten (Polymorphic Associations oder Junction Tables)
- 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:
- Kontext-Objekt: Neue Themen können ohne Schema-Änderung hinzugefügt werden
- Tag-System: Erweiterbar um neue Dokumentkategorien
- StatusProzess: Kann projektspezifisch angepasst werden
- 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
- Erstelle Projekt mit Label und Status
- Füge Parzellen zum Perimeter hinzu
- Lade Dokumente der Bauherrschaft hoch
- Verknüpfe Kontext-Informationen
Use Case 2: Bebaubarkeit prüfen
- Lade Parzelle mit allen Eigenschaften
- Prüfe AZ, BZ, Vollgeschosszahl
- Berücksichtige Hanglage, Schutzzonen
- Lade BZO der Gemeinde
- Prüfe Kontext-Informationen (Dienstbarkeiten, etc.)
Use Case 3: Nachbaranalyse
- Lade Parzelle
- Folge nachbarEigentuemer-Referenzen
- Zeige Eigentümer und Bebauung der Nachbarparzellen
Use Case 4: Dokumentensuche
- Suche über Tags (z.B. "Zonenplan")
- Filtere nach Format (z.B. PDF)
- Gruppiere nach Projekt/Parzelle/Gemeinde
Use Case 5: Revisionen verfolgen
- Prüfe Gemeinde.bzoRevision
- Prüfe Kanton.baureglementRevision
- Erstelle Kontext-Eintrag mit Hinweis auf negative Vorwirkung
Offene Fragen / Zu klären
- Versionierung: Sollen Änderungen an Parzellen historisiert werden?
- Mehrsprachigkeit: Labels in DE/FR/IT?
- Benutzer & Rollen: Wer darf was bearbeiten?
- Workflow-Engine: Für Statusübergänge und Genehmigungen?
- Integration: Anbindung an amtliche Geodaten (z.B. Swisstopo API)?
- Berechnungen: Sollen Ausnützungsberechnungen automatisiert werden?
Nächste Schritte
- Validierung: Review mit PEK
- Prototyp: Implementierung der Datenmodell-Klassen
- GIS-Integration: PostGIS aufsetzen, Test-Geodaten importieren
- API-Design: RESTful API (FastAPI) mit OpenAPI-Dokumentation