Private
Public Access
1
0
Files
u-desk/docs/04-功能迭代/GO-DESK-2.数据库客户端/设计文档/功能设计/表结构查看功能设计-待讨论问题.md

11 KiB
Raw Blame History

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

创建日期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

参数格式 已确定

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如何生成唯一KeyconnectionId + 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 问题:优化功能,可以后续迭代

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