Private
Public Access
1
0
Files
u-desk/docs/04-功能迭代/GO-DESK-2.数据库客户端/设计文档/需求设计/数据库类型功能差异分析.md

430 lines
15 KiB
Markdown
Raw 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.
# 数据库类型功能差异分析
**分析日期**2025-01-28
**分析范围**MySQL、Redis、MongoDB 功能支持差异
---
## 一、功能支持对比表
| 功能模块 | MySQL | Redis | MongoDB | 说明 |
|---------|-------|-------|---------|------|
| **连接管理** |
| 连接配置 | ✅ | ✅ | ✅ | 都支持主机、端口、用户名、密码MySQL默认端口3306/用户rootRedis默认端口6379/DB0MongoDB默认端口27017/用户admin |
| 数据库选择 | ✅ | ✅ | ✅ | MySQL/MongoDB=数据库名Redis=DB编号(0-15)连接树中Redis显示为"DB 0"、"DB 1"等,支持切换 |
| 连接测试 | ✅ | ✅ | ✅ | 都支持连接测试 |
| **SQL/命令执行** |
| 查询执行 | ✅ | ✅ | ✅ | MySQL=SELECTRedis=GET等MongoDB=find |
| 更新执行 | ✅ | ✅ | ✅ | MySQL=INSERT/UPDATE/DELETERedis=SET等MongoDB=insert/update |
| 结果类型 | query/update | command | query/update | MySQL区分查询/更新Redis统一为command |
| 执行超时 | 30秒 | 30秒 | 30秒 | 统一超时时间 |
| **数据库列表** |
| 获取数据库列表 | ✅ | ⚠️ | ✅ | Redis返回0-15MySQL/MongoDB动态查询 |
| 数据库切换 | ✅ | ✅ | ✅ | 都支持切换数据库 |
| **表/集合/Key列表** |
| 获取表列表 | ✅ | ✅ | ✅ | MySQL=表Redis=KeyMongoDB=集合 |
| 懒加载 | ✅ | ✅ | ✅ | 都支持懒加载 |
| 模式匹配 | ❌ | ✅ | ❌ | Redis支持Key模式匹配 |
| **表结构查询** |
| 表结构查询 | ✅ | ✅ | ✅ | MySQL=列信息Redis=Key信息MongoDB=集合结构 |
| 列信息 | ✅ | ❌ | ⚠️ | MySQL显示列详情MongoDB显示字段统计 |
| 索引信息 | ✅ | ❌ | ✅ | MySQL/MongoDB支持Redis不支持 |
| 文档示例 | ❌ | ❌ | ✅ | 仅MongoDB显示文档示例 |
| **索引查询** |
| 索引列表 | ✅ | ❌ | ⚠️ | MySQL独立查询MongoDB包含在集合结构中 |
| 索引详情 | ✅ | ❌ | ✅ | MySQL/MongoDB显示索引详情 |
| **编辑器支持** |
| 语法高亮 | SQL | JavaScript | JavaScript | MySQL使用SQLRedis/MongoDB使用JS |
| 默认内容 | `select 1;` | `GET key\nSET key value` | `db.collection.find({})` | 根据类型自动设置 |
| 执行按钮文本 | "执行" | "执行命令" | "执行查询" | 根据类型自动设置 |
| **结果展示** |
| 表格展示 | ✅ | ⚠️ | ⚠️ | MySQL适合表格Redis/MongoDB适合JSON |
| JSON展示 | ⚠️ | ✅ | ✅ | Redis/MongoDB命令结果用JSON展示 |
| 统计信息 | ✅ | ✅ | ✅ | 都显示执行时间和影响行数 |
| **数据存储** |
| SQL编辑器内容关联 | ✅ | ✅ | ✅ | 都支持SQL编辑器内容关联连接ID |
| ~~标签页关联~~ | ⚠️ | ⚠️ | ⚠️ | ~~暂时移除多Tab支持仅保留一个编辑区~~ |
| ~~书签支持~~ | ❌ | ❌ | ❌ | ~~功能已删除~~ |
| ~~模板支持~~ | ❌ | ❌ | ❌ | ~~功能已删除~~ |
**图例**
- ✅ 完全支持
- ⚠️ 部分支持或需要特殊处理
- ❌ 不支持
---
## 快速对比摘要
### 核心差异
| 维度 | MySQL | Redis | MongoDB |
|------|-------|-------|---------|
| **执行方式** | SQL语句 | 命令字符串 | JSON格式命令 |
| **数据结构** | 关系型表格 | 键值对 | 文档型JSON |
| **数据库概念** | 逻辑数据库 | DB编号(0-15) | 逻辑数据库 |
| **查询方式** | SQL查询 | 命令查询 | JSON命令 |
| **结果格式** | 表格数据 | 命令返回值 | 文档数组 |
| **语法高亮** | SQL | JavaScript | JavaScript |
| **结果展示** | 表格为主 | JSON为主 | JSON为主 |
### 功能完整性
- **MySQL**:⭐⭐⭐⭐⭐ (100%) - 功能最完整
- **Redis**:⭐⭐⭐⭐☆ (90%) - 核心功能完整索引不支持Redis特性
- **MongoDB**:⭐⭐⭐⭐☆ (85%) - 核心功能完整需要JSON格式待优化
---
## 二、详细功能差异分析
### 2.1 连接管理差异
#### MySQL
- **连接参数**:主机、端口、用户名、密码、数据库名
- **数据库选择**:通过数据库名选择,支持切换
- **连接方式**TCP连接支持SSL待实现
- **连接池**:支持连接复用
#### Redis
- **连接参数**主机、端口、密码、DB编号0-15
- **数据库选择**通过DB编号选择0-15共16个数据库
- **连接方式**TCP连接
- **连接池**:支持连接复用
- **特殊说明**database字段存储DB编号字符串格式
#### MongoDB
- **连接参数**:主机、端口、用户名、密码、数据库名(认证数据库)
- **数据库选择**:通过数据库名选择,支持切换
- **连接方式**TCP连接支持认证
- **连接池**:支持连接复用
- **特殊说明**数据库名可作为认证数据库authSource
---
### 2.2 SQL/命令执行差异
#### MySQL
- **执行方式**标准SQL语句
- **语句类型**
- 查询SELECT、SHOW、DESCRIBE、DESC、EXPLAIN
- 更新INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等
- **结果类型**
- `query`:查询结果,返回数据数组
- `update`:更新结果,返回影响行数
- **数据库参数**:支持指定数据库执行(覆盖连接配置)
- **多语句支持**支持多条SQL语句multiStatements
#### Redis
- **执行方式**Redis命令字符串解析
- **命令格式**`命令名 参数1 参数2 ...`(支持引号)
- **命令类型**所有Redis命令GET、SET、HGET、HSET、DEL等
- **结果类型**
- `command`:统一为命令结果,返回命令返回值
- **数据库参数**不支持使用连接配置的DB编号
- **命令解析**:支持带引号的参数(单引号/双引号)
#### MongoDB
- **执行方式**JSON格式命令当前实现
- **命令格式**JSON对象包含 `op`(操作类型)和操作参数
- **语句类型**
- 查询:`{"op": "find", "collection": "users", "filter": {}}`
- 更新:`{"op": "insertOne", "collection": "users", "document": {}}`
- **结果类型**
- `command`:统一为命令结果,根据操作类型确定影响行数
- **数据库参数**:支持指定数据库执行(覆盖连接配置)
- **特殊说明**当前使用JSON格式前端编辑器显示JavaScript语法MongoDB Shell风格但实际执行需要转换为JSON格式
---
### 2.3 数据库列表差异
#### MySQL
- **获取方式**`SHOW DATABASES`
- **返回结果**:数据库名称数组
- **动态查询**:实时查询服务器上的数据库
- **权限控制**:根据用户权限显示可见数据库
#### Redis
- **获取方式**固定返回0-15
- **返回结果**`["0", "1", "2", ..., "15"]`
- **特殊说明**Redis有16个逻辑数据库编号0-15
- **实现方式**:不查询服务器,直接返回固定列表
#### MongoDB
- **获取方式**`client.ListDatabases()`
- **返回结果**:数据库名称数组
- **动态查询**:实时查询服务器上的数据库
- **权限控制**:根据用户权限显示可见数据库
---
### 2.4 表/集合/Key列表差异
#### MySQL
- **获取方式**`SHOW TABLES`
- **返回结果**:表名数组
- **数据库参数**:必须指定数据库
- **懒加载**:展开数据库节点时加载
#### Redis
- **获取方式**`KEYS *` 或模式匹配
- **返回结果**Key名数组
- **数据库参数**使用连接配置的DB编号
- **模式匹配**:支持 `KEYS pattern`(如 `KEYS user:*`
- **性能注意**大量Key时可能较慢
#### MongoDB
- **获取方式**`db.ListCollectionNames()`
- **返回结果**:集合名数组
- **数据库参数**:必须指定数据库
- **懒加载**:展开数据库节点时加载
---
### 2.5 表结构查询差异
#### MySQL
- **获取方式**`DESCRIBE table_name``SHOW COLUMNS FROM table_name`
- **返回内容**
- 字段名Field
- 类型Type
- 是否为空Null
- 键信息Key
- 默认值Default
- 额外信息Extra
- **数据格式**:结构化列信息数组
#### Redis
- **获取方式**`TYPE key``TTL key``MEMORY USAGE key`
- **返回内容**
- Key类型string、hash、list、set、zset等
- TTL过期时间
- 值大小(内存占用)
- **数据格式**Key信息对象
#### MongoDB
- **获取方式**`db.collection.find().limit(5)` + 统计信息
- **返回内容**
- 文档示例最多5个
- 字段统计信息
- 索引信息(索引名、唯一性、键定义)
- 文档总数
- **数据格式**:集合结构对象(包含多个子对象)
---
### 2.6 索引查询差异
#### MySQL
- **获取方式**`SHOW INDEX FROM table_name`
- **返回内容**
- 索引名Key_name
- 列名Column_name
- 唯一性Non_unique
- 索引类型Index_type
- 排序方式Collation
- **数据格式**:索引信息数组
#### Redis
- **支持情况**:❌ 不支持索引
- **返回结果**:空数组 `[]`
- **说明**Redis是键值存储没有索引概念
#### MongoDB
- **获取方式**:包含在集合结构中(`GetCollectionStructure`
- **返回内容**
- 索引名
- 唯一性
- 键定义(字段和排序方向)
- **数据格式**:索引信息数组(从集合结构中提取)
- **特殊说明**:不提供独立的索引查询接口,索引信息包含在表结构查询中
---
### 2.7 编辑器支持差异
#### MySQL
- **语言模式**SQL语法高亮
- **默认内容**`select 1;`
- **执行按钮**`执行`
- **语法特性**标准SQL语法支持多语句
#### Redis
- **语言模式**JavaScript语法高亮用于命令编辑
- **默认内容**
```
GET key
SET key value
HGET hash field
```
- **执行按钮**`执行命令`
- **语法特性**:命令格式,支持引号参数
#### MongoDB
- **语言模式**JavaScript语法高亮MongoDB Shell语法用于编辑
- **默认内容**
```
db.collection.find({})
// 示例db.users.find({name: "John"})
```
- **执行按钮**`执行查询`
- **语法特性**编辑器显示MongoDB Shell语法但实际执行需要转换为JSON格式待实现自动转换
- **当前限制**需要手动输入JSON格式命令不支持直接执行Shell语法
---
### 2.8 结果展示差异
#### MySQL
- **展示模式**:主要使用表格模式
- **数据格式**:二维数组(行×列)
- **列定义**:自动从查询结果生成
- **统计信息**:行数、执行时间
- **JSON模式**:可选,用于特殊查询结果
#### Redis
- **展示模式**主要使用JSON模式
- **数据格式**:命令返回值(可能是字符串、数字、数组等)
- **统计信息**执行时间RowsAffected固定为1
- **表格模式**不适用Redis结果不是表格结构
#### MongoDB
- **展示模式**JSON模式为主表格模式可选
- **数据格式**文档数组BSON转换为JSON
- **列定义**:查询结果为空时无列定义
- **统计信息**:文档数、执行时间
- **表格模式**:适用于简单查询结果
---
## 三、实现差异总结
### 3.1 核心差异点
1. **执行方式**
- MySQL标准SQL语句
- Redis命令字符串解析
- MongoDBJavaScript代码执行待完善
2. **数据库概念**
- MySQL逻辑数据库包含表
- Redis逻辑数据库0-15包含Key
- MongoDB逻辑数据库包含集合
3. **数据结构**
- MySQL关系型表格结构
- Redis键值对无固定结构
- MongoDB文档型JSON结构
4. **查询方式**
- MySQLSQL查询
- Redis命令查询
- MongoDB查询表达式
5. **结果格式**
- MySQL表格数据
- Redis命令返回值
- MongoDB文档数组
### 3.2 统一处理策略
1. **结果类型统一**
- MySQL`query`/`update`
- Redis`command`
- MongoDB`query`/`update`
2. **展示模式统一**
- 表格模式适用于MySQL查询结果
- JSON模式适用于Redis命令结果和MongoDB查询结果
3. **编辑器统一**
- 根据数据库类型自动切换语言模式
- 自动设置默认内容和按钮文本
4. **API接口统一**
- 所有数据库类型使用相同的API接口
- 内部根据类型分发到不同的实现
---
## 四、功能完整性评估
### 4.1 MySQL功能完整性⭐⭐⭐⭐⭐ (100%)
- ✅ 所有核心功能已实现
- ✅ 查询、更新、表结构、索引查询完整
- ✅ 编辑器支持完善
### 4.2 Redis功能完整性⭐⭐⭐⭐☆ (90%)
- ✅ 核心功能已实现
- ⚠️ 索引查询不支持Redis本身不支持
- ✅ 命令执行、Key列表、Key信息查询完整
### 4.3 MongoDB功能完整性⭐⭐⭐⭐☆ (85%)
- ✅ 核心功能已实现
- ⚠️ 查询执行需要JSON格式不支持直接执行Shell语法
- ✅ 集合列表、集合结构查询完整
- ⚠️ 索引查询包含在集合结构中(非独立接口)
- ⚠️ 需要实现Shell语法到JSON的自动转换
---
## 五、优化建议
### 5.1 短期优化
1. **MongoDB查询执行优化**(高优先级)
- 当前需要JSON格式用户体验不佳
- 建议实现MongoDB Shell语法到JSON的自动转换
- 方案1集成JavaScript引擎如goja解析Shell语法
- 方案2实现简单的语法解析器支持常用操作
2. **Redis命令补全**
- 添加Redis命令自动补全功能
- 建议在编辑器中集成Redis命令提示
3. **MongoDB查询补全**
- 添加MongoDB Shell语法补全
- 建议在编辑器中集成MongoDB方法提示
### 5.2 长期优化
1. **统一查询接口**
- 考虑设计统一的查询语言或抽象层
- 当前各数据库使用不同的执行方式
2. **结果格式标准化**
- 进一步统一结果格式,便于前端处理
- 当前已有统一的结果类型,但数据格式仍有差异
3. **性能优化**
- Redis Key列表查询大量Key时
- MongoDB集合结构查询大量文档时
---
## 六、总结
### 6.1 功能支持情况
- **MySQL**:功能最完整,所有功能都已实现
- **Redis**核心功能完整索引查询不支持Redis特性
- **MongoDB**:核心功能完整,查询执行待完善
### 6.2 差异处理策略
- **统一接口**所有数据库类型使用相同的API接口
- **类型分发**:内部根据数据库类型分发到不同实现
- **结果统一**:统一结果类型和展示模式
- **编辑器适配**:根据数据库类型自动适配编辑器
### 6.3 后续工作
1. 完善MongoDB查询执行功能
2. 优化Redis大量Key查询性能
3. 添加命令/语法补全功能
4. 统一结果格式处理
---
**结论**不同数据库类型的功能差异主要体现在执行方式、数据结构、查询方式等方面但通过统一的接口设计和类型分发实现了良好的功能支持。MySQL功能最完整Redis和MongoDB核心功能已实现部分功能待完善。