File size: 10,319 Bytes
a282d4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# 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);
```