vault backup: 2026-04-22 10:10:19

This commit is contained in:
2026-04-22 10:10:19 +08:00
parent 51f07228d3
commit 388d4439de
15 changed files with 1656 additions and 355 deletions
+23 -23
View File
@@ -20,7 +20,7 @@ erDiagram
string password "密码(hash)"
datetime created_at "创建时间"
datetime updated_at "更新时间"
datetime deleted_at "删除时间(软删除)"
tinyint is_deleted "软删除标记"
}
WORD {
uuid id PK "单词记录ID"
@@ -31,7 +31,7 @@ erDiagram
string ai_provider "AI模型来源"
datetime created_at "创建时间"
datetime updated_at "更新时间"
datetime deleted_at "删除时间(软删除)"
tinyint is_deleted "软删除标记"
}
```
@@ -49,7 +49,7 @@ erDiagram
| `password` | VARCHAR(255) | NOT NULL | - | 用户密码,存储 bcrypt 哈希值,严禁明文存储 |
| `created_at` | DATETIME | DEFAULT CURRENT_TIMESTAMP | - | 账户创建时间 |
| `updated_at` | DATETIME | ON UPDATE CURRENT_TIMESTAMP | - | 账户最后更新时间 |
| `deleted_at` | DATETIME | DEFAULT NULL | INDEX | 软删除标记,NULL 表示未删除 |
| `is_deleted` | TINYINT | DEFAULT 0 | INDEX | 软删除标记,0 表示未删除,1 表示已删除 |
**索引设计:**
- 主键索引:`id`
@@ -60,23 +60,23 @@ erDiagram
| 单词表名 | `words` |
|-----------|---------|
| 字段名 | 数据类型 | 约束 | 索引 | 说明 |
| ------------- | ------------ | --------------------------- | ------------------------- | ------------------------------------------ |
| `id` | CHAR(36) | PRIMARY KEY | - | 单词记录唯一标识符(UUID 格式) |
| `user_id` | CHAR(36) | NOT NULL, FOREIGN KEY | - | 所属用户 ID,关联 users.id |
| `word` | VARCHAR(100) | NOT NULL | INDEX idx_word_search(20) | 单词文本,支持前缀搜索优化 |
| `definition` | TEXT | NOT NULL | - | AI 生成的单词释义 |
| `examples` | JSON | NOT NULL | - | 例句列表,存储 JSON 数组格式 |
| `ai_provider` | ENUM | NOT NULL | - | AI 模型来源标识(`deepseek`=DeepSeek,`qwen`=通义千问) |
| `created_at` | DATETIME | DEFAULT CURRENT_TIMESTAMP | - | 单词记录创建时间 |
| `updated_at` | DATETIME | ON UPDATE CURRENT_TIMESTAMP | - | 单词记录最后更新时间 |
| `deleted_at` | DATETIME | DEFAULT NULL | INDEX idx_user_word | 软删除标记 |
| 字段名 | 数据类型 | 约束 | 索引 | 说明 |
|--------|----------|------|------|------|
| `id` | CHAR(36) | PRIMARY KEY | - | 单词记录唯一标识符(UUID 格式) |
| `user_id` | CHAR(36) | NOT NULL, FOREIGN KEY | - | 所属用户 ID,关联 users.id |
| `word` | VARCHAR(100) | NOT NULL | INDEX idx_word_search(20) | 单词文本,支持前缀搜索优化 |
| `definition` | TEXT | NOT NULL | - | AI 生成的单词释义 |
| `examples` | JSON | NOT NULL | - | 例句列表,存储 JSON 数组格式 |
| `ai_provider` | ENUM | NOT NULL | - | AI 模型来源标识(`deepseek`=DeepSeek,`qwen`=通义千问) |
| `created_at` | DATETIME | DEFAULT CURRENT_TIMESTAMP | - | 单词记录创建时间 |
| `updated_at` | DATETIME | ON UPDATE CURRENT_TIMESTAMP | - | 单词记录最后更新时间 |
| `is_deleted` | TINYINT | DEFAULT 0 | INDEX idx_user_word | 软删除标记 |
**索引设计:**
- 主键索引:`id`
- 外键索引:`user_id`(自动创建)
- 唯一索引:`uk_user_word` (user_id, word(50)) - 防止同一用户保存重复单词
- 复合索引:`idx_user_word` (user_id, deleted_at) - 优化用户单词列表分页查询
- 复合索引:`idx_user_word` (user_id, is_deleted) - 优化用户单词列表分页查询
- 前缀索引:`idx_word_search` (word(20)) - 支持单词前缀搜索优化
## 四、表关联关系
@@ -97,15 +97,15 @@ erDiagram
```sql
-- 查询某用户的所有单词(排除已删除)
SELECT * FROM words
WHERE user_id = ? AND deleted_at IS NULL
WHERE user_id = ? AND is_deleted = 0
ORDER BY created_at DESC
LIMIT ? OFFSET ?;
-- 联表查询用户信息及单词数量
SELECT u.id, u.username, COUNT(w.id) as word_count
FROM users u
LEFT JOIN words w ON u.id = w.user_id AND w.deleted_at IS NULL
WHERE u.deleted_at IS NULL
LEFT JOIN words w ON u.id = w.user_id AND w.is_deleted = 0
WHERE u.is_deleted = 0
GROUP BY u.id;
```
@@ -126,7 +126,7 @@ GROUP BY u.id;
-- 查询:检查用户是否已保存该单词
SELECT id, word, definition, examples, ai_provider
FROM words
WHERE user_id = ? AND word = ? AND deleted_at IS NULL;
WHERE user_id = ? AND word = ? AND is_deleted = 0;
```
### 5.2 手动保存单词
@@ -147,14 +147,14 @@ VALUES (?, ?, ?, ?, ?, ?);
-- 查询:分页获取单词列表(按创建时间倒序)
SELECT id, word, definition, examples, ai_provider, created_at
FROM words
WHERE user_id = ? AND deleted_at IS NULL
WHERE user_id = ? AND is_deleted = 0
ORDER BY created_at DESC
LIMIT ? OFFSET ?;
-- 计算总数(用于分页器)
SELECT COUNT(*) as total
FROM words
WHERE user_id = ? AND deleted_at IS NULL;
WHERE user_id = ? AND is_deleted = 0;
```
### 5.4 删除单词(软删除)
@@ -164,8 +164,8 @@ WHERE user_id = ? AND deleted_at IS NULL;
```sql
-- 更新:软删除单词记录
UPDATE words
SET deleted_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP
WHERE id = ? AND user_id = ? AND deleted_at IS NULL;
SET is_deleted = 1, updated_at = CURRENT_TIMESTAMP
WHERE id = ? AND user_id = ? AND is_deleted = 0;
```
## 六、索引优化说明