Original Note

数据库设计文档 - Read

数据库设计文档

数据库概述

  • 数据库类型: PostgreSQL 14+
  • 字符集: UTF-8

ER图

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   users     │────<│   todos     │>────│  categories │
└─────────────┘     └─────────────┘     └─────────────┘

表结构

1. users(用户表)

字段 类型 约束 说明
id SERIAL PRIMARY KEY 用户ID
username VARCHAR(20) UNIQUE, NOT NULL 用户名
email 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