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)

-- 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);