From 7e9b1c68991a8c6b79471c9c5d18b201d1a08263 Mon Sep 17 00:00:00 2001 From: Maximilian <40673518+Java-Fish@users.noreply.github.com> Date: Sat, 7 Jun 2025 10:28:52 +0200 Subject: [PATCH] create er diagram --- ER_Diagramm.md | 211 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 ER_Diagramm.md diff --git a/ER_Diagramm.md b/ER_Diagramm.md new file mode 100644 index 0000000..2262814 --- /dev/null +++ b/ER_Diagramm.md @@ -0,0 +1,211 @@ +# ER-Diagramm - Django FBF Datenbank + +## Übersicht der Datenbankstruktur + +```mermaid +erDiagram + User ||--o{ FallenBird : creates + User ||--o{ Costs : creates + User ||--o{ Emailadress : creates + + Bird ||--o{ FallenBird : "is type of" + Bird ||--o{ BirdEmail : "has emails for" + + Circumstance ||--o{ FallenBird : "describes finding" + BirdStatus ||--o{ FallenBird : "has status" + Aviary ||--o{ FallenBird : "houses" + + FallenBird ||--o{ Costs : "has costs" + + ContactTag ||--o{ Contact : "categorizes" + + Emailadress ||--o{ BirdEmail : "used for birds" + + User { + int id PK + string username + string email + string first_name + string last_name + datetime date_joined + boolean is_active + boolean is_staff + boolean is_superuser + } + + FallenBird { + uuid id PK + string bird_identifier + uuid bird_id FK + string age + string sex + date date_found + string place + datetime created + datetime updated + uuid find_circumstances_id FK + string diagnostic_finding + int user_id FK + int status_id FK + uuid aviary_id FK + string sent_to + text comment + text finder + } + + Bird { + bigint id PK + string name UK + richtext description + } + + BirdStatus { + bigint id PK + string description UK + } + + Circumstance { + bigint id PK + string description + } + + Aviary { + uuid id PK + string description UK + string condition + date last_ward_round + string comment + } + + Costs { + uuid id PK + uuid id_bird_id FK + decimal costs + date created + string comment + int user_id FK + } + + Contact { + uuid id PK + string name + string phone + string email + string address + string comment + uuid tag_id_id FK + } + + ContactTag { + uuid id PK + string tag + } + + Emailadress { + int id PK + string email_address + datetime created_at + datetime updated_at + int user_id FK + } + + BirdEmail { + int id PK + int bird_id FK + int email_id FK + } +``` + +## Tabellenbeschreibungen + +### Kern-Entitäten + +#### `FallenBird` (Patienten) +- **Zweck**: Zentrale Entität für gefundene/verletzte Vögel +- **Primärschlüssel**: UUID +- **Beziehungen**: + - Gehört zu einem `Bird` (Vogelart) + - Hat einen `BirdStatus` (Status) + - Wird von einem `User` erstellt + - Kann in einer `Aviary` (Voliere) untergebracht sein + - Hat `Circumstance` (Fundumstände) + - Kann `Costs` (Kosten) haben + +#### `Bird` (Vogelarten) +- **Zweck**: Katalog der verschiedenen Vogelarten +- **Primärschlüssel**: BigInt +- **Eindeutig**: Name +- **Beziehungen**: Hat viele `FallenBird` Instanzen + +#### `Aviary` (Volieren) +- **Zweck**: Unterbringungsplätze für die Vögel +- **Primärschlüssel**: UUID +- **Status**: Offen, Geschlossen, Gesperrt +- **Beziehungen**: Kann mehrere `FallenBird` beherbergen + +### Referenz-Tabellen + +#### `BirdStatus` (Patientenstatus) +- **Zweck**: Status-Katalog (z.B. "In Behandlung", "Freigelassen", "Verstorben") +- **Primärschlüssel**: BigInt + +#### `Circumstance` (Fundumstände) +- **Zweck**: Katalog der Fundumstände (z.B. "Verletzt gefunden", "Aus Nest gefallen") +- **Primärschlüssel**: BigInt + +### Kosten-Management + +#### `Costs` (Kosten) +- **Zweck**: Kostenerfassung pro Patient +- **Primärschlüssel**: UUID +- **Beziehungen**: Gehört zu einem `FallenBird` und wird von einem `User` erstellt + +### Kontakt-Management + +#### `Contact` (Kontakte) +- **Zweck**: Kontaktdaten (Finder, Tierärzte, etc.) +- **Primärschlüssel**: UUID +- **Beziehungen**: Kann mit `ContactTag` kategorisiert werden + +#### `ContactTag` (Kontakt-Tags) +- **Zweck**: Kategorisierung von Kontakten +- **Primärschlüssel**: UUID + +### E-Mail-System + +#### `Emailadress` (E-Mail-Adressen) +- **Zweck**: Verwaltung von E-Mail-Adressen +- **Primärschlüssel**: BigInt +- **Beziehungen**: Gehört zu einem `User` + +#### `BirdEmail` (Vogel-E-Mail-Verknüpfung) +- **Zweck**: Many-to-Many Beziehung zwischen Vögeln und E-Mail-Adressen +- **Primärschlüssel**: BigInt + +## Datenbank-Design-Prinzipien + +### Primärschlüssel-Strategien +- **UUID**: Für Geschäftsobjekte (`FallenBird`, `Aviary`, `Contact`, `ContactTag`, `Costs`) +- **BigInt**: Für Referenzdaten (`Bird`, `BirdStatus`, `Circumstance`) und E-Mail-System + +### Beziehungstypen +- **1:N**: Die meisten Beziehungen (User zu FallenBird, Bird zu FallenBird, etc.) +- **M:N**: `Bird` ↔ `Emailadress` über `BirdEmail` +- **Optional**: `FallenBird.aviary` (kann NULL sein) + +### Besondere Eigenschaften +- **Soft References**: `Costs.id_bird` mit `SET_NULL` für Datenschutz +- **Audit Trail**: `created`/`updated` Felder in wichtigen Tabellen +- **Rich Text**: `Bird.description` für formatierte Beschreibungen +- **JSON/Array Fields**: Potentiell für Kosten-Historie (siehe `costs_default()` Funktion) + +## Geschäftslogik-Unterstützung + +Das Schema unterstützt folgende Geschäftsprozesse: + +1. **Patientenaufnahme**: FallenBird → Bird, Circumstance, User +2. **Unterbringung**: FallenBird → Aviary +3. **Statusverfolgung**: FallenBird → BirdStatus +4. **Kostenverfolgung**: FallenBird → Costs +5. **Kontaktverwaltung**: Contact → ContactTag +6. **E-Mail-Benachrichtigungen**: Bird → BirdEmail → Emailadress