# 表结构查看功能 - 待讨论问题

**创建日期**：2026-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 问题**：优化功能，可以后续迭代

---

**下一步**：根据讨论结果更新设计文档，明确实现细节。

