BankBot-AI / docs /ER_DIAGRAM.md
mohsin-devs's picture
Deploy to HF
a282d4b
# BankBot AI β€” Entity Relationship Diagram
## ER Diagram (Text Notation)
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ USERS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ email VARCHAR UNIQUE NOT NULL β”‚
β”‚ password_hash VARCHAR NOT NULL (bcrypt, rounds=12) β”‚
β”‚ profile_data JSON {name, phone, avatar, plan} β”‚
β”‚ financial_personality VARCHAR (Saver/Investor/Balanced/...) β”‚
β”‚ ai_personalization_settings JSON β”‚
β”‚ created_at TIMESTAMP β”‚
β”‚ updated_at TIMESTAMP β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ 1
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ N β”‚ N β”‚ N
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ACCOUNTS β”‚ β”‚ SUBSCRIPTIONS β”‚ β”‚ GOALS β”‚
β”‚ PK id UUID β”‚ β”‚ PK id UUID β”‚ β”‚ PK id UUID β”‚
β”‚ FK user_id β”‚ β”‚ FK user_id β”‚ β”‚ FK user_id β”‚
β”‚ type VARCHAR β”‚ β”‚ merchant VARCHAR β”‚ β”‚ title VARCHAR β”‚
β”‚ (checking/ β”‚ β”‚ amount FLOAT β”‚ β”‚ target_amount β”‚
β”‚ savings/ β”‚ β”‚ billing_cycle β”‚ β”‚ current_amount β”‚
β”‚ investment) β”‚ β”‚ active BOOLEAN β”‚ β”‚ target_date β”‚
β”‚ balance FLOAT β”‚ β”‚ ai_usage_ β”‚ β”‚ ai_generated_ β”‚
β”‚ currency VARCHARβ”‚ β”‚ detection JSON β”‚ β”‚ plan JSON β”‚
β”‚ status VARCHAR β”‚ └─────────────────────-β”€β”˜ └──────────────────-β”€β”€β”˜
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ 1
β”‚ N
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ TRANSACTIONS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ FK account_id β†’ ACCOUNTS.id β”‚
β”‚ amount FLOAT NOT NULL β”‚
β”‚ type VARCHAR (credit / debit) β”‚
β”‚ category VARCHAR (Food/Shopping/Income/...) β”‚
β”‚ merchant VARCHAR β”‚
β”‚ timestamp TIMESTAMP β”‚
β”‚ tags JSON [] β”‚
β”‚ ai_generated_metadata JSON {} β”‚
β”‚ spending_emotion_label VARCHAR (impulsive/planned/recurring) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ 1
β”‚ 0..1
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ FRAUD_LOGS β”‚
β”‚ PK id UUID β”‚
β”‚ FK transaction_id β”‚
β”‚ risk_score FLOAT β”‚
β”‚ (0.0 – 1.0) β”‚
β”‚ suspicious_activity_ β”‚
β”‚ details TEXT β”‚
β”‚ status VARCHAR β”‚
β”‚ (pending/resolved/ β”‚
β”‚ false_positive) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ INVESTMENTS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ FK user_id β†’ USERS.id β”‚
β”‚ asset_name VARCHAR (S&P 500, AAPL, BTC, ...) β”‚
β”‚ type VARCHAR (stock/crypto/mutual_fund/bond) β”‚
β”‚ amount_invested FLOAT β”‚
β”‚ current_value FLOAT β”‚
β”‚ portfolio_allocation FLOAT (percentage) β”‚
β”‚ ai_risk_analysis JSON {risk, expected_return, rec} β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ NOTIFICATIONS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ FK user_id β†’ USERS.id β”‚
β”‚ title VARCHAR NOT NULL β”‚
β”‚ message TEXT NOT NULL β”‚
β”‚ type VARCHAR (alert/insight/warning) β”‚
β”‚ read_status BOOLEAN DEFAULT false β”‚
β”‚ created_at TIMESTAMP β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ AI_INSIGHTS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ FK user_id β†’ USERS.id β”‚
β”‚ type VARCHAR (recommendation/briefing/cashflow) β”‚
β”‚ content TEXT NOT NULL β”‚
β”‚ created_at TIMESTAMP β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ANALYTICS_SNAPSHOTS β”‚
β”‚ PK id VARCHAR UUID β”‚
β”‚ FK user_id β†’ USERS.id β”‚
β”‚ date TIMESTAMP NOT NULL β”‚
β”‚ total_balance FLOAT β”‚
β”‚ total_spending FLOAT β”‚
β”‚ total_savings FLOAT β”‚
β”‚ financial_score FLOAT β”‚
β”‚ trends_json JSON β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```
## Relationships Summary
| From | To | Type | Description |
|------|----|------|-------------|
| USERS | ACCOUNTS | 1:N | User has multiple bank accounts |
| USERS | SUBSCRIPTIONS | 1:N | User has multiple subscriptions |
| USERS | GOALS | 1:N | User has multiple financial goals |
| USERS | INVESTMENTS | 1:N | User has multiple investments |
| USERS | NOTIFICATIONS | 1:N | User receives notifications |
| USERS | AI_INSIGHTS | 1:N | User has AI-generated insights |
| USERS | ANALYTICS_SNAPSHOTS | 1:N | Daily financial snapshots |
| ACCOUNTS | TRANSACTIONS | 1:N | Account has many transactions |
| TRANSACTIONS | FRAUD_LOGS | 1:0..1 | Transaction may have one fraud log |
## Indexes (Performance)
```sql
-- Primary lookup patterns
CREATE INDEX idx_transactions_account_id ON transactions(account_id);
CREATE INDEX idx_transactions_timestamp ON transactions(timestamp DESC);
CREATE INDEX idx_transactions_category ON transactions(category);
CREATE INDEX idx_fraud_logs_transaction ON fraud_logs(transaction_id);
CREATE INDEX idx_notifications_user_read ON notifications(user_id, read_status);
CREATE INDEX idx_accounts_user_id ON accounts(user_id);
CREATE INDEX idx_goals_user_id ON goals(user_id);
CREATE INDEX idx_investments_user_id ON investments(user_id);
```