数据库设计文档
数据库概述
- 数据库类型: PostgreSQL 14+
- 字符集: UTF-8
ER图
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ users │────<│ todos │>────│ categories │
└─────────────┘ └─────────────┘ └─────────────┘
表结构
1. users(用户表)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | SERIAL | PRIMARY KEY | 用户ID |
| username | VARCHAR(20) | UNIQUE, NOT NULL | 用户名 |
| VARCHAR(100) | UNIQUE, NOT NULL | 邮箱 | |
| password_hash | VARCHAR(255) | NOT NULL | 密码哈希 |
| created_at | TIMESTAMP | NOT NULL | 创建时间 |
| updated_at | TIMESTAMP | NOT NULL | 更新时间 |
索引:
- idx_users_username (username)
- idx_users_email (email)
2. categories(分类表)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | SERIAL | PRIMARY KEY | 分类ID |
| user_id | INTEGER | FOREIGN KEY, NOT NULL | 所属用户 |
| name | VARCHAR(30) | NOT NULL | 分类名称 |
| color | VARCHAR(10) | 颜色(HEX) | |
| created_at | TIMESTAMP | NOT NULL | 创建时间 |
外键:
- fk_categories_user → users(id)
索引:
- idx_categories_user (user_id)
3. todos(待办事项表)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | SERIAL | PRIMARY KEY | 待办ID |
| user_id | INTEGER | FOREIGN KEY, NOT NULL | 所属用户 |
| category_id | INTEGER | FOREIGN KEY | 所属分类 |
| title | VARCHAR(100) | NOT NULL | 标题 |
| description | TEXT | 描述 | |
| status | VARCHAR(20) | NOT NULL, DEFAULT 'pending' | 状态 |
| priority | VARCHAR(20) | DEFAULT 'medium' | 优先级 |
| due_date | DATE | 截止日期 | |
| completed_at | TIMESTAMP | 完成时间 | |
| created_at | TIMESTAMP | NOT NULL | 创建时间 |
| updated_at | TIMESTAMP | NOT NULL | 更新时间 |
外键:
- fk_todos_user → users(id)
- fk_todos_category → categories(id)
索引:
- idx_todos_user (user_id)
- idx_todos_status (status)
- idx_todos_due_date (due_date)
SQL建表语句
-- 用户表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(20) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 分类表
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
name VARCHAR(30) NOT NULL,
color VARCHAR(10),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 待办事项表
CREATE TABLE todos (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
category_id INTEGER REFERENCES categories(id) ON DELETE SET NULL,
title VARCHAR(100) NOT NULL,
description TEXT,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
priority VARCHAR(20) DEFAULT 'medium',
due_date DATE,
completed_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 索引
CREATE INDEX idx_todos_user ON todos(user_id);
CREATE INDEX idx_todos_status ON todos(status);
CREATE INDEX idx_todos_due_date ON todos(due_date);
数据迁移
使用 Alembic 进行数据库迁移管理。
# 初始化
alembic init migrations
# 创建迁移
alembic revision --autogenerate -m "initial tables"
# 执行迁移
alembic upgrade head