[ PROMPT_NODE_24622 ]
模式设计
[ SKILL_DOCUMENTATION ]
# 模式设计原则
> 范式化、主键、时间戳及关系设计。
## 范式化决策
何时进行范式化(拆分表):
├── 数据在多行中重复
├── 更新操作需要修改多处
├── 关系明确
└── 查询模式受益
何时进行反范式化(嵌入/冗余):
├── 读取性能至关重要
├── 数据很少变更
├── 数据总是被一起获取
└── 需要更简单的查询
## 主键选择
| 类型 | 使用场景 |
|------|----------|
| **UUID** | 分布式系统, 安全性要求高 |
| **ULID** | UUID + 按时间排序 |
| **自增 ID** | 简单应用, 单数据库 |
| **自然键** | 极少使用(具有业务含义) |
## 时间戳策略
每张表都应包含:
├── created_at → 创建时间
├── updated_at → 最后修改时间
└── deleted_at → 软删除(如果需要)
使用 TIMESTAMPTZ(带时区)而不是 TIMESTAMP
## 关系类型
| 类型 | 场景 | 实现方式 |
|------|------|----------------|
| **一对一** | 扩展数据 | 独立表加外键 |
| **一对多** | 父子关系 | 在子表加外键 |
| **多对多** | 双向多对多 | 使用关联表 |
## 外键 ON DELETE 策略
├── CASCADE → 随父记录一起删除
├── SET NULL → 子记录变为空值
├── RESTRICT → 如果存在子记录则禁止删除
└── SET DEFAULT → 子记录设为默认值