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

323 lines
9.1 KiB
Text

// Prisma Schema für Architektur-Planungs-App
// Unterstützt PostgreSQL mit PostGIS
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
extensions = [postgis]
}
// ============================================================================
// ENUMS
// ============================================================================
enum StatusProzess {
EINGANG
ANALYSE
STUDIE
PLANUNG
BAURECHTSVERFAHREN
UMSETZUNG
ARCHIV
}
enum DokumentTyp {
DATEI
URL
}
enum TagTyp {
KATASTER_OBJEKTE
KATASTER_WERKELEITUNGEN
KATASTER_BELASTETE_STANDORTE
KATASTER_BAEUME
ZONENPLAN
PGB
BZO
PARKPLATZVERORDNUNG
EIGENTUEMER_AUSKUNFT
GRUNDBUCHAUSZUG
}
enum GeoTagTyp {
REFERENZPUNKT_KAT1
REFERENZPUNKT_KAT2
REFERENZPUNKT_KAT3
GEOMETER_AUFNAHME
}
enum JaNein {
LEER
JA
NEIN
}
// ============================================================================
// MODELS
// ============================================================================
model Projekt {
id String @id @default(uuid()) @db.Uuid
label String
statusProzess StatusProzess[]
// Relationships
perimeter ParzelleInProjekt[]
dokumenteBauherrschaft ProjektDokumentBauherrschaft[]
dokumentePlanung ProjektDokumentPlanung[]
geoBaulinie GeoPunkt[]
kontextInformationen Kontext[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("projekt")
}
model Parzelle {
id String @id @default(uuid()) @db.Uuid
label String
parzellenNummern String[]
eigentuemerschaaft String?
strasseNr String?
// Geografischer Kontext
landId String? @db.Uuid
kantonId String? @db.Uuid
gemeindeId String? @db.Uuid
// Geometrie (als GeoJSON oder WKT gespeichert)
// Für echte PostGIS Integration: Unsupported.("geometry(POLYGON, 2056)")
geoUmfangJson Json? // Alternative: GeoJSON Format
// Bauliche Parameter
bauzone String?
az Float?
bz Float?
vollgeschossZahl Int?
anrechenbarDachgeschoss Float?
anrechenbarUntergeschoss Float?
gebaeudehoehe_max Float?
// Regelungen
regelnGrenzabstand String?
regelnMehrlaengenzuschlag String?
regelnMehrhoehenzuschlag String?
// Schutzzonen
hochwasserschutzzone String?
laermschutzzone String?
grundwasserschutzzone String?
// Eigenschaften
parzelleBebaut JaNein?
parzelleErschlossen JaNein?
hanglage JaNein?
// Relationships
projekte ParzelleInProjekt[]
nachbarEigentuemer_von ParzelleNachbar[] @relation("ParzelleNachbarVon")
nachbarEigentuemer_zu ParzelleNachbar[] @relation("ParzelleNachbarZu")
kontextLand Land? @relation(fields: [landId], references: [id])
kontextKanton Kanton? @relation(fields: [kantonId], references: [id])
kontextGemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id])
spezifischeDokumente ParzelleDokument[]
kontextInformationen Kontext[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("parzelle")
}
model Dokument {
id String @id @default(uuid()) @db.Uuid
label String
versionsbezeichnung String?
typ DokumentTyp
format String?
dokumentReferenz String
tags TagTyp[]
// Relationships
projekteBauherrschaft ProjektDokumentBauherrschaft[]
projektePlanung ProjektDokumentPlanung[]
parzellen ParzelleDokument[]
// Spezifische Dokumente für Gemeinde/Kanton
gemeindeBzoAktuell Gemeinde[] @relation("GemeindeBZOAktuell")
gemeindeBzoRevision Gemeinde[] @relation("GemeindeBZORevision")
kantonBaureglementAktuell Kanton[] @relation("KantonBaureglementAktuell")
kantonBaureglementRevision Kanton[] @relation("KantonBaureglementRevision")
kantonBauverordnungAktuell Kanton[] @relation("KantonBauverordnungAktuell")
kantonBauverordnungRevision Kanton[] @relation("KantonBauverordnungRevision")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("dokument")
}
model GeoPunkt {
id String @id @default(uuid()) @db.Uuid
x Float
y Float
z Float?
referenzen GeoTagTyp[]
// Foreign Keys
projektId String? @db.Uuid
projekt Projekt? @relation(fields: [projektId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("geo_punkt")
}
model Kontext {
id String @id @default(uuid()) @db.Uuid
thema String
inhalt String @db.Text
// Polymorphe Beziehung (kann zu verschiedenen Entitäten gehören)
projektId String? @db.Uuid
parzelleId String? @db.Uuid
landId String? @db.Uuid
kantonId String? @db.Uuid
gemeindeId String? @db.Uuid
// Relationships
projekt Projekt? @relation(fields: [projektId], references: [id], onDelete: Cascade)
parzelle Parzelle? @relation(fields: [parzelleId], references: [id], onDelete: Cascade)
land Land? @relation(fields: [landId], references: [id], onDelete: Cascade)
kanton Kanton? @relation(fields: [kantonId], references: [id], onDelete: Cascade)
gemeinde Gemeinde? @relation(fields: [gemeindeId], references: [id], onDelete: Cascade)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("kontext")
}
model Gemeinde {
id String @id @default(uuid()) @db.Uuid
label String
plz String?
// BZO Dokumente
bzoAktuellId String? @db.Uuid
bzoRevisionId String? @db.Uuid
// Relationships
parzellen Parzelle[]
kontextInformationen Kontext[]
bzoAktuell Dokument? @relation("GemeindeBZOAktuell", fields: [bzoAktuellId], references: [id])
bzoRevision Dokument? @relation("GemeindeBZORevision", fields: [bzoRevisionId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("gemeinde")
}
model Kanton {
id String @id @default(uuid()) @db.Uuid
label String
// Regelwerke
baureglementAktuellId String? @db.Uuid
baureglementRevisionId String? @db.Uuid
bauverordnungAktuellId String? @db.Uuid
bauverordnungRevisionId String? @db.Uuid
// Relationships
parzellen Parzelle[]
kontextInformationen Kontext[]
baureglementAktuell Dokument? @relation("KantonBaureglementAktuell", fields: [baureglementAktuellId], references: [id])
baureglementRevision Dokument? @relation("KantonBaureglementRevision", fields: [baureglementRevisionId], references: [id])
bauverordnungAktuell Dokument? @relation("KantonBauverordnungAktuell", fields: [bauverordnungAktuellId], references: [id])
bauverordnungRevision Dokument? @relation("KantonBauverordnungRevision", fields: [bauverordnungRevisionId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("kanton")
}
model Land {
id String @id @default(uuid()) @db.Uuid
label String
// Relationships
parzellen Parzelle[]
kontextInformationen Kontext[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("land")
}
// ============================================================================
// JUNCTION TABLES (Many-to-Many)
// ============================================================================
model ParzelleInProjekt {
projektId String @db.Uuid
parzelleId String @db.Uuid
projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade)
parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade)
@@id([projektId, parzelleId])
@@map("projekt_parzelle")
}
model ParzelleNachbar {
parzelleId String @db.Uuid
nachbarId String @db.Uuid
parzelle Parzelle @relation("ParzelleNachbarVon", fields: [parzelleId], references: [id], onDelete: Cascade)
nachbar Parzelle @relation("ParzelleNachbarZu", fields: [nachbarId], references: [id], onDelete: Cascade)
@@id([parzelleId, nachbarId])
@@map("parzelle_nachbar")
}
model ProjektDokumentBauherrschaft {
projektId String @db.Uuid
dokumentId String @db.Uuid
projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade)
dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade)
@@id([projektId, dokumentId])
@@map("projekt_dokument_bauherrschaft")
}
model ProjektDokumentPlanung {
projektId String @db.Uuid
dokumentId String @db.Uuid
projekt Projekt @relation(fields: [projektId], references: [id], onDelete: Cascade)
dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade)
@@id([projektId, dokumentId])
@@map("projekt_dokument_planung")
}
model ParzelleDokument {
parzelleId String @db.Uuid
dokumentId String @db.Uuid
parzelle Parzelle @relation(fields: [parzelleId], references: [id], onDelete: Cascade)
dokument Dokument @relation(fields: [dokumentId], references: [id], onDelete: Cascade)
@@id([parzelleId, dokumentId])
@@map("parzelle_dokument")
}