Files
AFC-Demo/misc/database-tables-detailed-description.md
T

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