375 lines
11 KiB
Markdown
375 lines
11 KiB
Markdown
# 表结构查看功能 - 待讨论问题
|
||
|
||
**创建日期**:2025-01-28
|
||
**目的**:整理设计文档中需要进一步讨论和明确的问题
|
||
|
||
---
|
||
|
||
## 一、实现细节待明确
|
||
|
||
### 1.1 MongoDB 字段统计实现方式
|
||
|
||
**问题**:FIXME标记 - 使用采样统计,默认采样10个文档
|
||
|
||
**需要讨论**:
|
||
- ✅ 已确定:使用采样统计,默认采样10个文档
|
||
- ⚠️ 待明确:
|
||
- 采样方式:使用 `$sample` 聚合管道还是 `find().limit(10)`? FIME:sample
|
||
- 采样数量:10个是否足够?是否需要可配置? FIXME:后期支持可配置
|
||
- 性能影响:10个文档的性能如何?是否需要异步加载? FIXME: 全异步
|
||
- 前端展示:是否需要显示"基于10个文档采样"的提示?FIXME: 展示
|
||
|
||
**建议**:
|
||
- 使用 `$sample` 聚合管道随机采样(更准确)
|
||
- 默认采样10个文档(性能好,准确性适中)
|
||
- 前端明确标注"基于10个文档采样统计"
|
||
- 后续可扩展为可配置采样数量(P2)
|
||
|
||
---
|
||
|
||
### 1.2 触发查看结构(已确定)
|
||
|
||
**触发方式**:
|
||
- ✅ 点击连接节点:查看连接的数据库列表结构
|
||
- ✅ 点击数据库节点:查看数据库的表/集合列表结构
|
||
- ✅ 点击表/集合/Key节点:查看具体的表/集合/Key结构
|
||
- ✅ 结构信息展示区域自动激活(切换到"结构"Tab并打开)
|
||
|
||
**实现方式**:
|
||
- 在 `handleTreeSelect` 中,根据节点类型触发 `table-structure` 事件
|
||
- 事件处理函数自动切换到结果面板的"结构"Tab
|
||
- 如果结果面板隐藏,自动显示
|
||
|
||
---
|
||
|
||
### 1.3 连接树右键菜单实现
|
||
**问题**:如何实现右键菜单触发"查看结构"
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- Arco Design Tree 组件是否支持右键菜单?
|
||
- 如果不支持,是否需要自定义实现?
|
||
- 右键菜单的选项有哪些?(查看结构、生成SQL、删除等)
|
||
- 菜单位置和样式如何设计?
|
||
|
||
**建议**:
|
||
- 检查 Arco Design Tree 的右键菜单支持
|
||
- 如果不支持,使用 `@contextmenu` 事件自定义菜单
|
||
- 菜单选项:查看结构、生成SELECT语句、复制表名(根据节点类型显示不同选项)
|
||
FIXME: 系统性设计右键菜单补充相关设计文档
|
||
---
|
||
|
||
### 1.4 事件名称和参数传递(已确定)
|
||
|
||
**事件名称**:✅ `table-structure`
|
||
|
||
**参数格式**:✅ 已确定
|
||
```typescript
|
||
emit('table-structure', {
|
||
connectionId: number,
|
||
database: string,
|
||
tableName: string, // 表名/集合名/Key名,对于连接和数据库节点可能为空
|
||
dbType: 'mysql' | 'mongo' | 'redis',
|
||
nodeType: 'table' | 'collection' | 'key' | 'database' | 'connection'
|
||
})
|
||
```
|
||
|
||
**事件处理**:
|
||
- 在 `index.vue` 中监听 `table-structure` 事件
|
||
- 调用 `useStructureState.loadStructure()` 加载结构数据
|
||
- 自动切换到结果面板的"结构"Tab
|
||
|
||
**详细设计**:详见 `事件系统设计.md`
|
||
|
||
---
|
||
|
||
### 1.5 结构Tab的显示/隐藏逻辑(已确定)
|
||
|
||
**方案**:✅ **方案二 - 始终显示Tab**
|
||
|
||
**实现方式**:
|
||
- "结构"Tab始终显示在结果面板中
|
||
- 无数据时显示空状态提示:"请从连接树中选择节点查看结构"
|
||
- 有数据时显示结构内容
|
||
- 切换连接时,清空结构数据,显示空状态
|
||
- 执行SQL时,结构Tab保留,不清空数据
|
||
|
||
**优点**:
|
||
- ✅ Tab位置固定,用户习惯更好
|
||
- ✅ 用户可以随时查看结构,无需先触发查看
|
||
|
||
**空状态设计**:
|
||
- 显示图标和提示文本
|
||
- 提供操作引导:"右键点击连接树节点 → 查看结构"
|
||
---
|
||
|
||
### 1.6 多表结构查看场景(已确定)
|
||
|
||
**方案**:✅ **方案一 - 单表查看,查看新表时替换当前结构**
|
||
|
||
**实现方式**:
|
||
- 查看新表时,替换当前结构数据
|
||
- 结构Tab始终只有一个表的结构
|
||
- 简单直接,符合当前设计
|
||
|
||
**未来扩展**:
|
||
- **方案二**:在SQL编辑器Tab区域支持结构Tab
|
||
- 右键菜单添加"在新Tab中查看结构"选项
|
||
- 在SQL编辑器Tab区域创建结构Tab
|
||
- 可以同时查看多个表的结构
|
||
- 详见 `多表结构查看方案分析.md`
|
||
|
||
**当前阶段**:
|
||
- P0:使用方案一(单表查看)
|
||
- P2:考虑实现方案二(SQL编辑器Tab支持结构Tab)
|
||
|
||
---
|
||
|
||
### 1.6 结构数据与查询结果的冲突
|
||
|
||
**问题**:查看结构时执行SQL,如何处理结果展示
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 执行SQL时,结构Tab是否自动切换到"结果"Tab?
|
||
- 结构数据是否保留,还是清空?
|
||
- 用户如何切换回结构Tab?
|
||
|
||
**建议**:FIXME: OK
|
||
- 执行SQL时,自动切换到"结果"Tab
|
||
- 结构数据保留,不清空
|
||
- 用户可以手动切换回"结构"Tab继续查看
|
||
|
||
---
|
||
|
||
## 二、技术实现待明确
|
||
|
||
### 2.1 数据缓存策略
|
||
|
||
**问题**:结构数据缓存的具体实现
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 缓存位置:前端缓存(内存)还是后端缓存?
|
||
- 缓存Key:如何生成唯一Key?(connectionId + database + tableName)
|
||
- 缓存时间:5分钟是否合适?
|
||
- 缓存失效:何时清除缓存?(切换连接、表结构变更后)
|
||
|
||
**建议**:OK
|
||
- 前端缓存:使用 Map 存储,Key为 `${connectionId}-${database}-${tableName}`
|
||
- 缓存时间:5分钟(可配置)
|
||
- 缓存失效:切换连接时清除,手动刷新时清除
|
||
|
||
---
|
||
|
||
### 2.2 权限检查实现
|
||
|
||
**问题**:编辑功能如何检查数据库用户权限
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 权限检查时机:编辑模式切换时还是保存时?
|
||
- 权限检查方式:如何检查 ALTER TABLE、CREATE INDEX 权限?
|
||
- 权限不足时的提示:如何友好地提示用户?
|
||
|
||
**建议**:OK
|
||
- 切换编辑模式时检查权限
|
||
- 使用 `SHOW GRANTS` 或尝试执行测试语句检查权限
|
||
- 权限不足时禁用编辑功能,显示提示信息
|
||
|
||
---
|
||
|
||
### 2.3 确认对话框设计
|
||
|
||
**问题**:编辑保存时的确认对话框内容
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 对话框内容:显示什么信息?(SQL语句、影响范围、风险提示)
|
||
- 确认方式:是否需要二次确认?
|
||
- 取消操作:取消时如何处理未保存的修改?
|
||
|
||
**建议**:OK
|
||
- 显示将要执行的 SQL 语句(完整 ALTER TABLE 语句)
|
||
- 显示影响范围(修改的字段/索引数量)
|
||
- 显示风险提示("此操作不可撤销,请确认")
|
||
- 取消时保留编辑内容,不切换回查看模式
|
||
|
||
---
|
||
|
||
### 2.4 错误处理和重试
|
||
|
||
**问题**:加载结构数据失败时的处理
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 错误提示:如何显示错误信息?
|
||
- 重试机制:是否自动重试?重试次数?
|
||
- 部分失败:如果部分数据加载成功,如何处理?
|
||
|
||
**建议**:OK
|
||
- 显示详细的错误信息(错误类型、错误消息)
|
||
- 提供"重试"按钮,不自动重试
|
||
- 部分失败时显示已加载的数据,标注失败的部分
|
||
|
||
---
|
||
|
||
## 三、用户体验待明确
|
||
|
||
### 3.1 加载状态展示
|
||
|
||
**问题**:加载结构数据时的用户体验
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 加载提示:显示什么内容?(Spin、进度条、加载文本)
|
||
- 加载时间:如果加载较慢,是否需要超时处理?
|
||
- 骨架屏:是否需要使用骨架屏提升体验?
|
||
|
||
**建议**:OK
|
||
- 使用 Arco Design Spin 组件 + "加载中..."文本
|
||
- 设置超时时间(30秒),超时后提示用户
|
||
- 大数据集时显示"数据较多,加载可能需要一些时间"的提示
|
||
|
||
---
|
||
|
||
### 3.2 空状态设计
|
||
|
||
**问题**:无结构数据时的展示
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 空状态内容:显示什么提示?
|
||
- 操作引导:是否需要提供操作按钮?
|
||
|
||
**建议**:OK
|
||
- 显示空状态图标和提示文本
|
||
- 提供"刷新"按钮
|
||
- 根据数据库类型显示不同的提示(MySQL/MongoDB/Redis)
|
||
|
||
---
|
||
|
||
### 3.3 数据刷新策略
|
||
|
||
**问题**:何时自动刷新结构数据
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 自动刷新:是否需要自动刷新?(表结构可能被其他工具修改)
|
||
- 刷新时机:切换Tab时?定时刷新?
|
||
- 手动刷新:刷新按钮的位置和样式?
|
||
|
||
**建议**:OK
|
||
- 不自动刷新(避免不必要的请求)
|
||
- 提供手动刷新按钮(在结构Tab工具栏)
|
||
- 编辑保存后自动刷新
|
||
|
||
---
|
||
|
||
## 四、扩展功能待明确
|
||
|
||
### 4.1 导出功能实现
|
||
|
||
**问题**:导出功能的具体实现方式
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 导出格式:SQL、JSON、文本的具体格式?
|
||
- 导出内容:导出哪些信息?(字段、索引、注释等)
|
||
- 导出方式:下载文件还是复制到剪贴板?
|
||
|
||
**建议**:OK
|
||
- MySQL:导出为 CREATE TABLE 语句(包含字段、索引、注释)
|
||
- MongoDB:导出为 JSON Schema 格式
|
||
- Redis:导出为文本格式(Key信息) FIXME: 不需要
|
||
- 支持下载文件和复制到剪贴板两种方式
|
||
|
||
---
|
||
|
||
### 4.2 编辑功能的撤销/重做
|
||
|
||
**问题**:编辑模式是否需要撤销/重做功能
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 是否需要撤销/重做功能?
|
||
- 如果需要,如何实现?(历史记录、操作栈)
|
||
- 撤销范围:单次操作还是多次操作?
|
||
|
||
**建议**:OK
|
||
- P2功能,暂不实现
|
||
- 如果需要,使用操作栈记录每次修改
|
||
- 支持撤销最近10次操作
|
||
|
||
---
|
||
|
||
## 五、性能优化待明确
|
||
|
||
### 5.1 大数据集处理
|
||
|
||
**问题**:字段/索引很多时的性能优化
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 分页加载:何时启用分页?(字段数 > 50?)
|
||
- 虚拟滚动:是否需要虚拟滚动?
|
||
- 懒加载:Tab切换时是否懒加载内容?
|
||
|
||
**建议**:OK
|
||
- 字段数 > 50 时启用分页(每页20条)
|
||
- 使用 Arco Design Table 的内置分页
|
||
- Tab切换时懒加载(使用 v-if)
|
||
|
||
---
|
||
|
||
### 5.2 网络请求优化
|
||
|
||
**问题**:如何减少不必要的网络请求
|
||
|
||
**需要讨论**:
|
||
- ⚠️ 待明确:
|
||
- 请求合并:是否可以合并多个请求?
|
||
- 请求取消:切换表时是否取消之前的请求?
|
||
- 请求去重:相同请求是否去重?
|
||
|
||
**建议**:ok
|
||
- 使用 AbortController 取消之前的请求
|
||
- 相同请求使用缓存,不重复请求
|
||
- 字段和索引信息可以合并为一个请求(当前已实现)
|
||
|
||
---
|
||
|
||
## 六、总结
|
||
|
||
### 优先级分类
|
||
|
||
**P0(必须明确)**:
|
||
1. ✅ MongoDB字段统计实现方式(已确定:采样10个文档)
|
||
2. ⚠️ 连接树右键菜单实现方式 FIXME: 做系统性全局设计, 在部分优先功能区开始设计实现,如连接区右键
|
||
3. ⚠️ 事件名称和参数格式 FIXME: 做个系统性全局设计,简洁易于扩展各种事件都简洁强大,
|
||
4. ⚠️ 结构Tab显示/隐藏逻辑
|
||
5. ⚠️ 结构数据与查询结果的冲突处理
|
||
|
||
**P1(重要)**:
|
||
1. ⚠️ 数据缓存策略
|
||
2. ⚠️ 权限检查实现
|
||
3. ⚠️ 确认对话框设计
|
||
4. ⚠️ 错误处理和重试
|
||
|
||
**P2(优化)**:
|
||
1. ⚠️ 加载状态优化
|
||
2. ⚠️ 空状态设计
|
||
3. ⚠️ 导出功能实现
|
||
4. ⚠️ 大数据集处理
|
||
|
||
### 建议讨论顺序
|
||
|
||
1. **首先讨论 P0 问题**:这些是核心功能,必须明确
|
||
2. **然后讨论 P1 问题**:影响用户体验,需要仔细设计
|
||
3. **最后讨论 P2 问题**:优化功能,可以后续迭代
|
||
|
||
---
|
||
|
||
**下一步**:根据讨论结果更新设计文档,明确实现细节。
|
||
|