558 lines
20 KiB
Markdown
558 lines
20 KiB
Markdown
# 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
|
|
|
|
```mermaid
|
|
---
|
|
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
|