数据库设计指南

数据库范式

范式规则违反示例
1NF原子值、无重复组、行唯一一列存 "tag1,tag2"
2NF1NF + 消除对复合主键的部分依赖order_items 中存 product_name(只依赖 product_id)
3NF2NF + 消除传递依赖(非键→非键)同时存邮编和城市(城市依赖邮编而非主键)
BCNF3NF + 每个决定因素都是候选键教师→教室(教师不是候选键)
反范式化为读取性能故意违反范式存 order_total 避免每次重新计算

关系类型

关系实现方式示例
一对一任意一方加外键(或共享主键)user → user_profile
一对多"多"方加外键user → orders(orders 中有 user_id)
多对多中间表含两个外键orders ↔ products 通过 order_items
自引用外键指向同一张表employees.manager_id → employees.id
多态关联类型列 + 外键指向多张表comments(commentable_type, commentable_id)

Schema 设计模式

-- 电商 Schema 示例(规范化) CREATE TABLE users ( id BIGSERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE products ( id BIGSERIAL PRIMARY KEY, sku VARCHAR(64) UNIQUE NOT NULL, name VARCHAR(255) NOT NULL, price NUMERIC(10, 2) NOT NULL CHECK (price >= 0), category_id INT REFERENCES categories(id) ); CREATE TABLE orders ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id), status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending','paid','shipped','completed','cancelled')), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE order_items ( order_id BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE, product_id BIGINT NOT NULL REFERENCES products(id), quantity INT NOT NULL CHECK (quantity > 0), unit_price NUMERIC(10, 2) NOT NULL, -- 下单时的价格快照 PRIMARY KEY (order_id, product_id) ); -- 软删除模式 ALTER TABLE products ADD COLUMN deleted_at TIMESTAMPTZ; -- 查询:WHERE deleted_at IS NULL