db/DSL.md

104 lines
3.8 KiB
Markdown
Raw Permalink Normal View History

# 数据库架构 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 // 更新记录
```