# 数据库设计规范

## 命名规范

| 元素 | 规则 | 示例 |
|:----|:-----|:-----|
| 数据库 | 项目名_环境 | `mm_ai_dev`, `mm_ai_prod` |
| 表名 | 小写蛇形复数 | `users`, `order_items`, `user_roles` |
| 字段名 | 小写蛇形 | `user_id`, `created_at`, `is_active` |
| 主键 | `id` | `BIGINT UNSIGNED AUTO_INCREMENT` |
| 外键 | `{关联表单数}_id` | `user_id`, `order_id` |
| 唯一索引 | `uk_{表}_{字段}` | `uk_users_email` |
| 普通索引 | `idx_{表}_{字段}` | `idx_users_status` |
| 联合索引 | `idx_{表}_{f1}_{f2}` | `idx_users_status_created` |

## 每张表必须包含的字段

```sql
`id`         BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间（软删除）',
```

## 字段类型选择

| 数据类型 | 长度 | 适用场景 |
|:---------|:-----|:---------|
| `TINYINT` | 1 | 状态/枚举（小于 256 个值） |
| `SMALLINT` | 2 | 小范围数值 |
| `INT` | 4 | 常规数值（推荐 `INT UNSIGNED`） |
| `BIGINT` | 8 | 大数值/ID（推荐 `BIGINT UNSIGNED`） |
| `VARCHAR(32)` | 可变 | 短文本（状态码、手机号） |
| `VARCHAR(255)` | 可变 | 常规文本（名称、邮箱、标题） |
| `TEXT` | 可变 | 长文本（描述、备注） |
| `LONGTEXT` | 可变 | 超长文本（文章内容） |
| `DECIMAL(10,2)` | 精确 | 金额（禁止使用 FLOAT/DOUBLE） |
| `JSON` | 可变 | 结构化数据（MySQL 5.7+） |
| `DATETIME` | 8 | 时间（推荐，时区无关用） |
| `TIMESTAMP` | 4 | 时间戳（时区相关） |

## SQL 编写规范

### 基本规则
- 关键字大写：`SELECT`, `FROM`, `WHERE`, `INSERT INTO`
- 字段名小写反引号包裹：`` `user_id` ``
- 每行一个字段，缩进对齐
- JOIN 表使用别名

### 查询示例
```sql
SELECT
  u.`id`,
  u.`name`,
  u.`email`,
  o.`order_no`,
  o.`amount`
FROM `users` u
INNER JOIN `orders` o ON o.`user_id` = u.`id`
WHERE u.`status` = 1
  AND o.`created_at` >= '2024-01-01'
ORDER BY o.`created_at` DESC
LIMIT 20;
```

### 索引设计原则
1. WHERE 条件字段建索引
2. ORDER BY 字段建索引（与 WHERE 组合建联合索引）
3. JOIN 关联字段必须建索引
4. 区分度低的字段（性别、状态）不适合单独建索引
5. 联合索引遵循"最左前缀"原则
6. 不要给每个字段都建索引（影响写入性能）

### 禁止行为
- ❌ 禁止使用 `SELECT *`（必须明确指定字段）
- ❌ 禁止在大表上使用 `LIKE '%keyword%'`
- ❌ 禁止在循环中执行 SQL（用批量操作替代）
- ❌ 禁止存储明文密码（必须哈希处理）
- ❌ 禁止使用外键约束（用代码逻辑保证数据一致性）
- ❌ 禁止在事务中执行耗时操作
