用途
Database Schema Design 是一套数据库模式设计模式集合,面向 SQL 与 NoSQL 数据库,用于指导开发者设计规范、可扩展的数据库结构。资料以 PostgreSQL 为主要示例,同时包含 Drizzle ORM 的 TypeScript 模式定义方式。
核心原则
资料给出的核心原则包括:先规范化,再为性能反规范化;使用合适的数据类型,选择能容纳数据的最小类型;根据查询模式而非假设来策略性地建立索引;提前规划增长,尽早考虑分区。
命名规范
- 表名:复数、snake_case,如 users、order_items、user_addresses
- 列名:snake_case,如 first_name、created_at、is_active
- 主键:id,如 id SERIAL PRIMARY KEY
- 外键:单数表名_id,如 user_id REFERENCES users(id)
- 索引:idx_表_列,如 CREATE INDEX idx_users_email ON users(email);
- 约束:chk_/uq_/fk_ 前缀,如 CONSTRAINT uq_users_email UNIQUE (email)、CONSTRAINT chk_orders_amount CHECK (amount > 0)
常见模式
资料提供了多种常见关系模式的 SQL 示例:
- 用户表:包含 UUID 主键、邮箱唯一约束、密码哈希、角色检查约束、激活状态、邮箱验证时间、创建与更新时间,并建立邮箱索引和基于激活状态的部分角色索引。
- 一对多关系:以 posts 表为例,通过 user_id 外键关联 users,设置 ON DELETE CASCADE,并建立 user_id 索引和针对已发布状态的部分复合索引。
- 多对多关系:以 tags 与 post_tags 中间表为例,中间表使用复合主键,并为 tag_id 建立索引。
- 多态关联:给出两种方案,推荐使用独立表(post_comments、image_comments),备选方案是单表加 commentable_type 与 commentable_id 类型列。
Drizzle ORM 模式
资料展示了使用 drizzle-orm/pg-core 定义 users 与 posts 表的方式,包括 uuid、varchar、text、timestamp、boolean 等列类型,主键默认随机、唯一约束、外键级联删除、索引定义,以及通过 relations 定义一对多关系。
索引策略
资料列出多种索引类型:单列索引、复合索引(列顺序重要)、部分索引(更小更快)、表达式索引(如 LOWER(email))、JSONB 的 GIN 索引。
软删除与审计
软删除方案通过 deleted_at 时间戳标记删除,查询时过滤 deleted_at IS NULL,并可为活跃记录建立部分索引。审计日志方案提供 audit_logs 表结构以及 audit_trigger_func 触发器函数,记录表名、记录 ID、操作类型、旧数据、新数据、用户 ID 和创建时间。
最佳实践
资料列出的最佳实践包括:对外暴露的 ID 始终使用 UUID;所有表添加 created_at 与 updated_at 时间戳;使用外键约束保证引用完整性;根据查询而非假设创建索引;谨慎使用 ENUM 类型,优先使用检查约束;业务需要审计追踪时规划软删除;多表操作使用事务;按时间或类别对大表进行分区。
适用场景与限制
该资料适合后端开发者、数据库设计人员和需要统一数据库规范的团队作为设计参考。资料以 PostgreSQL 示例为主,其他数据库的适配方式暂未提供;NoSQL 的具体设计模式在资料中未展开说明。