db/DSL.md

104 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库架构 DSL (Schema-as-Code)
本模块提供了一种基于文本的 DSL领域专用语言来定义数据库架构。它支持 MySQL、PostgreSQL 和 SQLite旨在实现 AI 友好的“架构即代码”。
## 语法概览
一个架构描述由 **分组 (Groups)**、**数据表 (Tables)** 和 **字段 (Fields)** 组成。
### 分组 (Groups)
分组由以 `==` 开头的行定义,用于逻辑隔离不同的表集合。
```
== 用户系统 ==
```
### 数据表 (Tables)
数据表在分组下顶格定义。可以在 `//` 后添加注释。
在表名后添加 `SD` 标记可启用 **影子删除 (Shadow Deletion)**。启用后,删除的数据会自动移动到 `[表名]_deleted` 表中。
```
users SD // 系统用户表
```
### 字段 (Fields)
字段在数据表下通过缩进(空格或制表符)定义。
格式:`[名称] [类型标记][长度] [索引标记] // [注释]`
```
id AI // 主键,自动递增
username v32 U // Varchar(32),唯一索引
password v64 // Varchar(64)
version ver // Bigint 版本号,用于乐观锁和增量同步
create_time ct // 创建时间 (CURRENT_TIMESTAMP)
update_time ctu // 更新时间 (ON UPDATE CURRENT_TIMESTAMP)
```
## 类型标记 (Type Tags)
| 标记 | 对应数据库类型 (MySQL) | 说明 |
|-----|-----------------|------|
| `i` | `int` | 整型 |
| `ui`| `int unsigned` | 无符号整型 |
| `bi`| `bigint` | 长整型 |
| `ubi`| `bigint unsigned` | 无符号长整型 |
| `ti`| `tinyint` | 短整型 |
| `v` | `varchar` | 默认长度由驱动决定或忽略 |
| `v[N]`| `varchar(N)` | 例如:`v50` -> `varchar(50)` |
| `c[N]`| `char(N)` | 例如:`c32` -> `char(32)` |
| `t` | `text` | 文本 |
| `dt`| `datetime` | 日期时间 |
| `d` | `date` | 日期 |
| `tm`| `time` | 时间 |
| `f` | `float` | 浮点数 |
| `ff`| `double` | 双精度浮点数 |
| `b` | `tinyint unsigned`| 布尔值别名 |
| `bb`| `blob` | 二进制大对象 |
## 索引与特殊标记
| 标记 | 含义 |
|-----|---------|
| `PK` | 主键 (Primary Key) |
| `AI` | 自动递增 + 主键 (Auto Increment) |
| `U` | 唯一索引 (Unique Index) |
| `I` | 普通索引 (Index) |
| `TI` | 全文索引 (Fulltext Index, 仅 MySQL) |
| `ver`| 版本号字段 (用于乐观锁和增量同步) |
| `ct` | 创建时间 (Created Time) |
| `ctu`| 更新时间 (Updated Time) |
| `nn` | 非空 (NOT NULL) |
| `n` | 可为空 (NULL) |
### 复合索引
`I``U` 后添加数字可以将多个字段组合成一个复合索引。
```
first_name v32 I1
last_name v32 I1 // 在 (first_name, last_name) 上创建复合索引 'ik_table_1'
```
## 高级特性
### 1. 影子删除 (SD - Shadow Deletion)
当表标记为 `SD` 时,调用 `db.Remove()` 方法不会真正删除数据,而是将其从原表移动到 `_deleted` 后缀的影子表中。
- **优点**:主表查询不包含已删除数据,效率更高;历史数据可追溯。
- **API**: 使用 `db.Remove(table, conditions, args...)` 触发。
### 2. 乐观锁与增量同步 (ver)
标记为 `ver` 的字段(通常命名为 `version`)具有特殊行为:
- **自动递增**:每次调用 `db.Update()` 时,该字段会自动 `+1`
- **冲突检测**:如果在更新数据中包含了当前版本号,`db.Update()` 会在 `WHERE` 条件中自动加入版本校验。如果版本不一致,更新将失败(影响行数为 0
- **增量同步**:外部系统可以通过 `WHERE version > last_version` 轻松获取自上次同步以来的所有变更。
## 完整示例
```
== 默认分组 ==
users SD // 用户表
id AI // 用户 ID
username v32 U // 登录名
email v64 U // 联系邮箱
password v128 // 加密后的密码
status ti I // 0: 活跃, 1: 禁用
version ver // 行版本号
created_at ct // 创建记录
updated_at ctu // 更新记录
```