333 lines
10 KiB
Markdown
333 lines
10 KiB
Markdown
# Detaillierte Beschreibung der Datenbank-Tabellen
|
|
|
|
## **Backend Schema**
|
|
|
|
### **1. backend.transactions**
|
|
|
|
**Zweck**: Rohdaten-Tabelle für eingehende Transaktionen aus verschiedenen Quellen (vermutlich CSV/Excel-Uploads oder API-Imports)
|
|
|
|
**Struktur**: 14 Spalten
|
|
|
|
#### Identifikation
|
|
- **id** (integer, NOT NULL, AUTO_INCREMENT)
|
|
- Primärschlüssel
|
|
- Sequenz: `backend.transactions_id_seq`
|
|
|
|
#### Transaktions-Stammdaten
|
|
- **corporate_entity** (text, NOT NULL)
|
|
- Name der durchführenden Firma/Entität
|
|
- Kein Foreign Key - als Textfeld gespeichert
|
|
|
|
- **corporate_counterparty** (text, NOT NULL)
|
|
- Name der Gegenpartei/Empfänger
|
|
- Freitext, keine Normalisierung
|
|
|
|
- **tx_date** (text, NOT NULL)
|
|
- Transaktionsdatum
|
|
- ⚠️ Als Text gespeichert (nicht als DATE/TIMESTAMP)
|
|
- Wahrscheinlich verschiedene Formate möglich
|
|
|
|
- **tx_amount** (double precision, NOT NULL)
|
|
- Transaktionsbetrag
|
|
- Fließkommazahl für Währungsbeträge
|
|
|
|
- **tx_currency** (text, nullable)
|
|
- Währungscode (z.B. EUR, USD)
|
|
- Optional
|
|
|
|
- **tx_purpose** (text, nullable)
|
|
- Verwendungszweck/Beschreibung der Transaktion
|
|
- Freitextfeld
|
|
|
|
#### Geografische Informationen
|
|
- **tx_country_outgoing** (text, nullable)
|
|
- Herkunftsland der Zahlung
|
|
|
|
- **tx_country_incoming** (text, nullable)
|
|
- Zielland der Zahlung
|
|
|
|
#### Metadaten & Verarbeitung
|
|
- **source_file** (text, nullable)
|
|
- Name/Pfad der Quelldatei
|
|
- Für Nachverfolgbarkeit der Datenherkunft
|
|
|
|
- **raw_payload** (text, nullable)
|
|
- Rohdaten im Originalformat
|
|
- Ermöglicht Reprocessing bei Bedarf
|
|
|
|
- **status** (text, NOT NULL)
|
|
- Verarbeitungsstatus (z.B. "pending", "processed", "error")
|
|
|
|
- **created_at** (text, NOT NULL)
|
|
- Erstellungszeitpunkt
|
|
- ⚠️ Als Text gespeichert (nicht als TIMESTAMP)
|
|
|
|
- **last_modified_at** (text, NOT NULL)
|
|
- Letzte Änderung
|
|
- ⚠️ Als Text gespeichert (nicht als TIMESTAMP)
|
|
|
|
**Charakteristik**: ETL-/Staging-Tabelle mit lockerer Typisierung für maximale Flexibilität beim Import
|
|
|
|
---
|
|
|
|
### **2. backend.transaction_outputs**
|
|
|
|
**Zweck**: Speichert generierte Outputs/Ergebnisse aus Prompt-Verarbeitung für Transaktionen (vermutlich KI/LLM-generierte Analysen)
|
|
|
|
**Struktur**: 5 Spalten
|
|
|
|
#### Primärschlüssel (zusammengesetzt)
|
|
- **transaction_id** (integer, NOT NULL)
|
|
- Foreign Key zu `backend.transactions.id`
|
|
- Referenziert die analysierte Transaktion
|
|
|
|
- **prompt_id** (integer, NOT NULL)
|
|
- Foreign Key zu `backend.prompt_templates` (vermutlich)
|
|
- Identifiziert welcher Prompt verwendet wurde
|
|
|
|
- **output_key** (text, NOT NULL)
|
|
- Schlüssel für den Output-Typ
|
|
- Beispiele: "risk_assessment", "compliance_check", "summary", "recommendations"
|
|
|
|
#### Output-Daten
|
|
- **content** (text, NOT NULL)
|
|
- Der generierte Inhalt/Ergebnis
|
|
- Kann strukturierter Text, JSON oder Markdown sein
|
|
|
|
#### Verknüpfung
|
|
- **run_id** (integer, nullable)
|
|
- Foreign Key zu `backend.prompt_runs` (vermutlich)
|
|
- Gruppiert Outputs aus demselben Batch/Durchlauf
|
|
- Optional für ad-hoc Generierungen
|
|
|
|
**Charakteristik**: N:M-Mapping zwischen Transaktionen und Prompts mit flexiblen Output-Keys
|
|
|
|
---
|
|
|
|
## **Public Schema**
|
|
|
|
### **3. public.companies**
|
|
|
|
**Zweck**: Normalisierte Firmenstammdaten für KYC (Know Your Customer) und Compliance
|
|
|
|
**Struktur**: 11 Spalten
|
|
|
|
#### Identifikation
|
|
- **id** (bigint, NOT NULL, AUTO_INCREMENT)
|
|
- Primärschlüssel
|
|
- Sequenz: `companies_id_seq`
|
|
|
|
#### Firmenidentifikation
|
|
- **name** (varchar, NOT NULL)
|
|
- Primärer Firmenname (Kurzform/Handelsname)
|
|
|
|
- **legal_name** (varchar, nullable)
|
|
- Offizieller rechtlicher Name
|
|
- Kann vom Handelsnamen abweichen
|
|
|
|
- **ticker** (varchar, nullable)
|
|
- Börsenticker-Symbol (z.B. "AAPL", "MSFT")
|
|
- Nur für börsennotierte Unternehmen
|
|
|
|
#### Klassifikation & Lokalisierung
|
|
- **sector** (varchar, nullable)
|
|
- Wirtschaftssektor/Branche
|
|
- Z.B. "Technology", "Finance", "Manufacturing"
|
|
|
|
- **country** (varchar, NOT NULL, default: 'DE')
|
|
- Ländercode (ISO 2-Letter)
|
|
- Standard: Deutschland
|
|
|
|
- **headquarters** (varchar, nullable)
|
|
- Hauptsitz/Firmenzentrale
|
|
- Stadt oder Stadt + Land
|
|
|
|
#### Risk & Compliance
|
|
- **kyc_risk_level** (varchar, NOT NULL, default: 'medium')
|
|
- KYC-Risikoeinstufung
|
|
- Mögliche Werte: "low", "medium", "high"
|
|
- Default: mittleres Risiko
|
|
|
|
#### Zusatzinformationen
|
|
- **summary** (text, nullable)
|
|
- Firmenbeschreibung/Zusammenfassung
|
|
- Freitextfeld für Kontext
|
|
|
|
#### Zeitstempel
|
|
- **created_at** (timestamp, nullable)
|
|
- Erstellungszeitpunkt
|
|
|
|
- **updated_at** (timestamp, nullable)
|
|
- Letzte Aktualisierung
|
|
- Laravel-Standard für Timestamps
|
|
|
|
**Charakteristik**: Saubere, normalisierte Stammdatentabelle mit KYC-Fokus
|
|
|
|
---
|
|
|
|
### **4. public.transactions**
|
|
|
|
**Zweck**: Produktive Transaktionsdaten mit umfassender Anreicherung aus externen Datenquellen und Risikoanalyse
|
|
|
|
**Struktur**: 54 Spalten (!)
|
|
|
|
#### Identifikation
|
|
- **id** (bigint, NOT NULL, AUTO_INCREMENT) - 9x aufgelistet (⚠️ Schema-Anomalie!)
|
|
- Primärschlüssel
|
|
- Sequenz: `transactions_id_seq`
|
|
|
|
#### Transaktions-Basis
|
|
- **company_id** (bigint, NOT NULL, default: 1)
|
|
- Foreign Key zu `public.companies.id`
|
|
- Zuordnung zur durchführenden Firma
|
|
|
|
- **reference** (varchar, NOT NULL)
|
|
- Transaktionsreferenz/Buchungsnummer
|
|
- Eindeutiger Identifier
|
|
|
|
- **amount** (numeric, NOT NULL)
|
|
- Transaktionsbetrag
|
|
- Numeric für präzise Währungsbeträge
|
|
|
|
- **currency** (varchar, NOT NULL, default: 'EUR')
|
|
- Währungscode
|
|
- Standard: Euro
|
|
|
|
- **counterparty** (varchar, NOT NULL)
|
|
- Name der Gegenpartei
|
|
|
|
- **counterparty_country** (varchar, nullable)
|
|
- Land der Gegenpartei
|
|
|
|
- **channel** (varchar, nullable)
|
|
- Transaktionskanal (z.B. "wire", "sepa", "swift")
|
|
|
|
- **executed_at** (timestamp, NOT NULL)
|
|
- Ausführungszeitpunkt der Transaktion
|
|
|
|
#### Risk Management
|
|
- **risk_score** (smallint, NOT NULL, default: 0)
|
|
- Risikobewertung (0-100 oder ähnlich)
|
|
|
|
- **status** (varchar, NOT NULL)
|
|
- Transaktionsstatus (z.B. "pending", "approved", "flagged")
|
|
|
|
- **requires_review** (boolean, NOT NULL, default: true)
|
|
- Manuelles Review erforderlich?
|
|
|
|
- **flagged_by** (varchar, nullable)
|
|
- System/User der die Transaktion markiert hat
|
|
|
|
- **flagged_reason** (text, nullable)
|
|
- Grund für Markierung
|
|
|
|
- **signals** (json, nullable)
|
|
- Risikosignale/Trigger als JSON
|
|
- Strukturierte Risikoindikatoren
|
|
|
|
#### Externe Datenquellen (11 Integrationen)
|
|
|
|
**1. Registry (Handelsregister Basic)**
|
|
- **registry_company_number** (text)
|
|
- **registry_source** (text) - Quelle (z.B. "Handelsregister")
|
|
- **registry_match_score** (double precision) - Matching-Genauigkeit
|
|
- **registry_data** (jsonb) - Registrierungsdaten
|
|
- **registry_last_refreshed_at** (timestamp)
|
|
|
|
**2. Genesis (Statistisches Bundesamt)**
|
|
- **genesis_context** (jsonb)
|
|
- **genesis_last_refreshed_at** (timestamp)
|
|
|
|
**3. GovData (Offene Verwaltungsdaten)**
|
|
- **govdata_data** (jsonb)
|
|
- **govdata_last_refreshed_at** (timestamp)
|
|
|
|
**4. Bundesanzeiger**
|
|
- **bundesanzeiger_data** (jsonb)
|
|
- **bundesanzeiger_last_refreshed_at** (timestamp)
|
|
|
|
**5. Insolvency (Insolvenzregister)**
|
|
- **insolvency_data** (jsonb)
|
|
- **insolvency_last_refreshed_at** (timestamp)
|
|
|
|
**6. RSS Alerts (News/Medien)**
|
|
- **rss_alerts** (jsonb)
|
|
- **rss_last_refreshed_at** (timestamp)
|
|
|
|
**7. Sanctions (Sanktionslisten)**
|
|
- **sanctions_data** (jsonb)
|
|
- **sanctions_last_refreshed_at** (timestamp)
|
|
|
|
**8. PEP (Politically Exposed Persons)**
|
|
- **pep_data** (jsonb)
|
|
- **pep_last_refreshed_at** (timestamp)
|
|
|
|
**9. GLEIF (Legal Entity Identifier)**
|
|
- **gleif_lei** (text) - LEI-Nummer
|
|
- **gleif_data** (json)
|
|
- **gleif_last_refreshed_at** (timestamp)
|
|
|
|
**10. EU Sanctions**
|
|
- **eu_sanctions_data** (jsonb)
|
|
- **eu_sanctions_last_refreshed_at** (timestamp)
|
|
|
|
**11. Handelsregister (Extended)**
|
|
- **handelsregister_data** (jsonb)
|
|
- **handelsregister_last_refreshed_at** (timestamp)
|
|
- **handelsregister_status** (text)
|
|
- **handelsregister_entity_id** (bigint)
|
|
|
|
#### Zeitstempel
|
|
- **created_at** (timestamp, nullable)
|
|
- **updated_at** (timestamp, nullable)
|
|
|
|
**Charakteristik**: Hochgradig angereichertes Data Warehouse für Compliance und Risk Management mit Multi-Source-Integration
|
|
|
|
---
|
|
|
|
## Zusammenfassung der Architektur
|
|
|
|
```
|
|
┌─────────────────────────────────────┐
|
|
│ Backend Schema (Staging) │
|
|
├─────────────────────────────────────┤
|
|
│ • Rohdaten-Import │
|
|
│ • Lockere Typisierung (text) │
|
|
│ • Source-Tracking │
|
|
│ • Prompt/AI-Integration │
|
|
└────────────┬────────────────────────┘
|
|
│
|
|
│ ETL/Processing
|
|
↓
|
|
┌─────────────────────────────────────┐
|
|
│ Public Schema (Production) │
|
|
├─────────────────────────────────────┤
|
|
│ • Normalisierte Daten │
|
|
│ • Strikte Typisierung │
|
|
│ • Multi-Source-Enrichment │
|
|
│ • Risk & Compliance Features │
|
|
└─────────────────────────────────────┘
|
|
```
|
|
|
|
## Datenfluss-Hypothese
|
|
|
|
1. **Import**: Rohdaten landen in `backend.transactions`
|
|
2. **AI-Verarbeitung**: Prompts generieren Outputs in `backend.transaction_outputs`
|
|
3. **Enrichment**: Externe Datenquellen werden abgefragt
|
|
4. **Normalisierung**: Daten werden nach `public.companies` und `public.transactions` übertragen
|
|
5. **Risk Assessment**: Risikoscores und Flags werden berechnet
|
|
6. **Review**: Transaktionen mit `requires_review=true` landen in der Queue
|
|
|
|
## Technische Hinweise
|
|
|
|
### Probleme
|
|
- ⚠️ `public.transactions` hat 9x duplizierte `id` Spalte im Schema
|
|
- ⚠️ `backend.transactions` speichert Timestamps als TEXT statt TIMESTAMP
|
|
- ⚠️ Keine expliziten Foreign Key Constraints sichtbar zwischen den Schemas
|
|
|
|
### Empfehlungen
|
|
1. Schema-Anomalie in `public.transactions` untersuchen
|
|
2. Datum-Felder in `backend.transactions` zu echten TIMESTAMP-Typen migrieren
|
|
3. Indizes auf häufig genutzte JOIN/WHERE Spalten prüfen
|
|
4. Foreign Key Constraints zwischen den Schemas dokumentieren
|