Database Schema
ER Diagram
Tables
user_config
Single-row table (id luôn = 1). Lưu trữ thông tin tính Runway.
| Column | Type | Constraint | Mô tả |
|---|---|---|---|
| id | INTEGER | PK, CHECK(id = 1) | Luôn = 1 |
| total_cash | INTEGER | NOT NULL | Tổng tài sản |
| monthly_survival_cost | INTEGER | NOT NULL | Chi phí sinh tồn / tháng |
| daily_burn_rate | INTEGER | NOT NULL | Tốc độ đốt tiền / ngày |
| currency | TEXT | NOT NULL, DEFAULT 'VND' | Đơn vị tiền tệ |
| created_at | TEXT | NOT NULL | Timestamp tạo |
categories
Danh mục chi tiêu, mỗi danh mục có tier.
| Column | Type | Constraint | Mô tả |
|---|---|---|---|
| id | INTEGER | PK AUTOINCREMENT | - |
| name | TEXT | NOT NULL, UNIQUE | Tên danh mục |
| tier | INTEGER | NOT NULL, CHECK(1,2,3) | 1=Survival, 2=Comfort, 3=Wasted |
| is_system | INTEGER | NOT NULL, DEFAULT 0 | 1 nếu tạo từ Onboarding |
| created_at | TEXT | NOT NULL | Timestamp tạo |
transactions
Giao dịch thu/chi.
| Column | Type | Constraint | Mô tả |
|---|---|---|---|
| id | INTEGER | PK AUTOINCREMENT | - |
| amount | INTEGER | NOT NULL | Số tiền |
| date | TEXT | NOT NULL, DEFAULT date('now') | Ngày giao dịch (YYYY-MM-DD) |
| category_id | INTEGER | FK → categories(id) ON DELETE CASCADE | Danh mục |
| note | TEXT | NOT NULL, DEFAULT '' | Ghi chú |
| created_at | TEXT | NOT NULL | Timestamp tạo |
recurring_expenses
Chi phí định kỳ tự động lặp lại.
| Column | Type | Constraint | Mô tả |
|---|---|---|---|
| id | INTEGER | PK AUTOINCREMENT | - |
| name | TEXT | NOT NULL | Tên khoản chi |
| amount | INTEGER | NOT NULL | Số tiền |
| frequency | TEXT | NOT NULL, CHECK('daily','monthly') | Tần suất |
| day_of_month | INTEGER | nullable, CHECK(1-31) | Ngày trong tháng (monthly) |
| category_id | INTEGER | FK → categories(id) ON DELETE SET NULL | Danh mục |
| last_generated_date | TEXT | nullable | Ngày tạo transaction gần nhất |
| created_at | TEXT | NOT NULL | Timestamp tạo |
Indexes
| Index | Table | Column | Mục đích |
|---|---|---|---|
| idx_transactions_date | transactions | date | Tối ưu query theo ngày |
| idx_transactions_category | transactions | category_id | Tối ưu query theo danh mục |
Migration History
| Version | Mô tả |
|---|---|
| v1 | Tạo bảng user_config, categories, transactions + indexes |
| v2 | Thêm bảng recurring_expenses |
| v3 | Thêm cột currency vào user_config (default 'VND') |
| v4 | Thêm category_id và last_generated_date vào recurring_expenses |
Lưu ý
- Amounts lưu dưới dạng INTEGER (không phải float) để tránh lỗi làm tròn
- Dates lưu dưới dạng TEXT (ISO format YYYY-MM-DD)
date('now')trong SQLite trả về UTC - cần chú ý timezone khi hiển thị