docs(constitution): 新增数据库设计原则(v2.4.0)
在项目宪章中新增第九条原则"数据库设计原则",明确禁止使用数据库外键约束和ORM关联标签。 主要变更: - 新增原则IX:数据库设计原则(Database Design Principles) - 强制要求:数据库表不得使用外键约束 - 强制要求:GORM模型不得使用ORM关联标签(foreignKey、hasMany等) - 强制要求:表关系必须通过ID字段手动维护 - 强制要求:关联数据查询必须显式编写,避免ORM魔法 - 强制要求:时间字段由GORM处理,不使用数据库触发器 设计理念: - 提升业务逻辑灵活性(无数据库约束限制) - 优化高并发性能(无外键检查开销) - 增强代码可读性(显式查询,无隐式预加载) - 简化数据库架构和迁移流程 - 支持分布式和微服务场景 版本升级:2.3.0 → 2.4.0(MINOR)
This commit is contained in:
9
migrations/000001_init_schema.down.sql
Normal file
9
migrations/000001_init_schema.down.sql
Normal file
@@ -0,0 +1,9 @@
|
||||
-- migrations/000001_init_schema.down.sql
|
||||
-- 回滚初始化 Schema
|
||||
-- 删除表和索引
|
||||
|
||||
-- 删除订单表
|
||||
DROP TABLE IF EXISTS tb_order;
|
||||
|
||||
-- 删除用户表
|
||||
DROP TABLE IF EXISTS tb_user;
|
||||
80
migrations/000001_init_schema.up.sql
Normal file
80
migrations/000001_init_schema.up.sql
Normal file
@@ -0,0 +1,80 @@
|
||||
-- migrations/000001_init_schema.up.sql
|
||||
-- 初始化数据库 Schema
|
||||
-- 创建 tb_user 和 tb_order 表、索引
|
||||
-- 注意: 表关系和 updated_at 更新在代码中处理
|
||||
|
||||
-- 用户表
|
||||
CREATE TABLE IF NOT EXISTS tb_user (
|
||||
id SERIAL PRIMARY KEY,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
deleted_at TIMESTAMP,
|
||||
|
||||
-- 基本信息
|
||||
username VARCHAR(50) NOT NULL,
|
||||
email VARCHAR(100) NOT NULL,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
|
||||
-- 状态字段
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active',
|
||||
|
||||
-- 元数据
|
||||
last_login_at TIMESTAMP,
|
||||
|
||||
-- 唯一约束
|
||||
CONSTRAINT uk_user_username UNIQUE (username),
|
||||
CONSTRAINT uk_user_email UNIQUE (email)
|
||||
);
|
||||
|
||||
-- 用户表索引
|
||||
CREATE INDEX idx_user_deleted_at ON tb_user(deleted_at);
|
||||
CREATE INDEX idx_user_status ON tb_user(status);
|
||||
CREATE INDEX idx_user_created_at ON tb_user(created_at);
|
||||
|
||||
-- 订单表
|
||||
CREATE TABLE IF NOT EXISTS tb_order (
|
||||
id SERIAL PRIMARY KEY,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
deleted_at TIMESTAMP,
|
||||
|
||||
-- 业务唯一键
|
||||
order_id VARCHAR(50) NOT NULL,
|
||||
|
||||
-- 关联关系 (注意: 无数据库外键约束,在代码中管理)
|
||||
user_id INTEGER NOT NULL,
|
||||
|
||||
-- 订单信息
|
||||
amount BIGINT NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||||
remark VARCHAR(500),
|
||||
|
||||
-- 时间字段
|
||||
paid_at TIMESTAMP,
|
||||
completed_at TIMESTAMP,
|
||||
|
||||
-- 唯一约束
|
||||
CONSTRAINT uk_order_order_id UNIQUE (order_id)
|
||||
);
|
||||
|
||||
-- 订单表索引
|
||||
CREATE INDEX idx_order_deleted_at ON tb_order(deleted_at);
|
||||
CREATE INDEX idx_order_user_id ON tb_order(user_id);
|
||||
CREATE INDEX idx_order_status ON tb_order(status);
|
||||
CREATE INDEX idx_order_created_at ON tb_order(created_at);
|
||||
CREATE INDEX idx_order_order_id ON tb_order(order_id);
|
||||
|
||||
-- 添加注释
|
||||
COMMENT ON TABLE tb_user IS '用户表';
|
||||
COMMENT ON COLUMN tb_user.username IS '用户名(唯一)';
|
||||
COMMENT ON COLUMN tb_user.email IS '邮箱(唯一)';
|
||||
COMMENT ON COLUMN tb_user.password IS '密码(bcrypt 哈希)';
|
||||
COMMENT ON COLUMN tb_user.status IS '用户状态:active, inactive, suspended';
|
||||
COMMENT ON COLUMN tb_user.deleted_at IS '软删除时间';
|
||||
|
||||
COMMENT ON TABLE tb_order IS '订单表';
|
||||
COMMENT ON COLUMN tb_order.order_id IS '订单号(业务唯一键)';
|
||||
COMMENT ON COLUMN tb_order.user_id IS '用户 ID(在代码中维护关联,无数据库外键)';
|
||||
COMMENT ON COLUMN tb_order.amount IS '金额(分)';
|
||||
COMMENT ON COLUMN tb_order.status IS '订单状态:pending, paid, processing, completed, cancelled';
|
||||
COMMENT ON COLUMN tb_order.deleted_at IS '软删除时间';
|
||||
Reference in New Issue
Block a user