Private
Public Access
1
0
Files
u-desk/docs/04-功能迭代/GO-DESK-2.数据库客户端/设计文档/功能设计/多表结构查看方案分析.md
绝尘 a5d30684ed 重构:文件系统模块化架构,增强 Markdown 渲染
- 拆分 FileSystem.vue 为模块化组件架构
- 新增 Markdown Mermaid 图表渲染支持
- 新增 180+ 编程语言代码高亮
- 修复编辑/预览模式切换渲染问题
- 优化亮色/暗色模式主题适配
- 新增 TypeScript 类型定义
2026-02-04 03:32:46 +08:00

9.8 KiB
Raw Blame History

多表结构查看方案分析

分析日期2026-01-28
分析范围:多表结构查看的不同实现方案
状态:方案分析


一、需求分析

1.1 使用场景

用户可能需要:

  • 同时查看多个表的结构,进行对比
  • 查看表结构时,需要查看其他表的结构作为参考
  • 在SQL编写过程中需要频繁查看不同表的结构

1.2 当前限制

  • 方案一:单表查看,查看新表时替换当前结构
    • 优点:简单直接,界面不混乱
    • 缺点:无法同时查看多个表的结构

二、方案对比

方案一结果面板Tab中查看当前方案

实现方式

  • 在结果面板的"结构"Tab中查看
  • 查看新表时替换当前结构

优点

  • 实现简单
  • 界面简洁
  • 符合当前架构

缺点

  • 无法同时查看多个表
  • 切换表时丢失之前的结构信息

适用场景

  • 单表结构查看
  • 临时查看表结构

方案二SQL编辑器Tab中展示

实现方式

  • 在SQL编辑器的Tab区域新增"结构"类型的Tab
  • 每个表结构作为一个独立的Tab
  • Tab标题结构: database.table

界面布局

┌─────────────────────────────────────────────────────────┐
│  SQL编辑器区域                                           │
├─────────────────────────────────────────────────────────┤
│  [查询 1] [查询 2] [结构: test.users] [结构: test.orders] │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  [结构内容区域]                                          │
│  - 字段信息                                             │
│  - 索引信息                                             │
│                                                         │
└─────────────────────────────────────────────────────────┘

优点

  • 可以同时查看多个表的结构
  • Tab管理统一用户习惯好
  • 结构Tab和SQL Tab可以并存方便对比

缺点

  • ⚠️ SQL编辑器Tab区域可能变得拥挤
  • ⚠️ 需要区分SQL Tab和结构Tab
  • ⚠️ Tab切换逻辑更复杂

实现细节

// Tab类型定义
interface Tab {
  id: string
  key: string
  title: string
  type: 'sql' | 'structure'  // Tab类型
  content?: string  // SQL内容仅SQL Tab
  structureData?: StructureData  // 结构数据仅结构Tab
  connectionId?: number
  database?: string
  tableName?: string
}

// Tab管理
const tabs = ref<Tab[]>([])

// 创建结构Tab
const createStructureTab = (data: TableStructureEvent) => {
  const tabKey = `structure-${data.connectionId}-${data.database}-${data.tableName}`
  // 检查是否已存在
  const existingTab = tabs.value.find(t => t.key === tabKey)
  if (existingTab) {
    activeTab.value = existingTab.key
    return
  }
  
  // 创建新Tab
  const newTab: Tab = {
    id: null,
    key: tabKey,
    title: `结构: ${data.database}.${data.tableName}`,
    type: 'structure',
    connectionId: data.connectionId,
    database: data.database,
    tableName: data.tableName,
    structureData: null  // 异步加载
  }
  
  tabs.value.push(newTab)
  activeTab.value = newTab.key
  
  // 异步加载结构数据
  loadStructureData(newTab)
}

方案三结构Tab内部子Tab

实现方式

  • 在结果面板的"结构"Tab内部使用子Tab区分不同表
  • 子Tab标题database.table

界面布局

┌─────────────────────────────────────────────────────────┐
│  结果面板                                              │
├─────────────────────────────────────────────────────────┤
│  [结果] [消息] [结构]                                   │
├─────────────────────────────────────────────────────────┤
│  [test.users] [test.orders] [test.products]            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  [当前表结构内容]                                        │
│                                                         │
└─────────────────────────────────────────────────────────┘

优点

  • 结构查看区域独立不影响SQL编辑器
  • 可以同时查看多个表的结构
  • 结构Tab位置固定用户习惯好

缺点

  • ⚠️ 结构Tab内部Tab管理复杂度中等
  • ⚠️ Tab层级较深可能影响用户体验

方案四:侧边栏结构查看器

实现方式

  • 在左侧连接树区域,新增一个可折叠的结构查看面板
  • 或者使用抽屉Drawer从侧边滑出

界面布局

┌──────────┬─────────────────────────────────────────┐
│ 连接树   │  SQL编辑器                               │
│          │                                          │
│ [结构]   │                                          │
│ ────────│                                          │
│ test.users│                                        │
│ - 字段   │                                          │
│ - 索引   │                                          │
└──────────┴─────────────────────────────────────────┘

优点

  • 结构查看区域独立
  • 可以同时查看多个表使用Tab
  • 不影响SQL编辑器和结果区域

缺点

  • ⚠️ 需要额外的UI空间
  • ⚠️ 可能影响连接树的显示

三、方案推荐

3.1 短期方案P0

推荐:方案一(当前方案)+ 方案二(可选)

  • 默认使用方案一:在结果面板的"结构"Tab中查看查看新表时替换
  • 可选支持方案二:通过右键菜单选项"在新Tab中查看结构"在SQL编辑器Tab区域创建结构Tab

实现策略

  1. 右键菜单添加"查看结构"和"在新Tab中查看结构"两个选项
  2. "查看结构":使用方案一(结果面板)
  3. "在新Tab中查看结构"使用方案二SQL编辑器Tab

3.2 长期方案P2

推荐方案三结构Tab内部子Tab

  • 在结果面板的"结构"Tab内部使用子Tab管理多个表结构
  • 提供更好的多表对比体验
  • 不影响SQL编辑器Tab区域

四、实现建议

4.1 方案二实现要点

Tab类型区分

// Tab类型
type TabType = 'sql' | 'structure'

// Tab渲染
<template>
  <a-tab-pane 
    v-for="tab in tabs" 
    :key="tab.key"
    :title="tab.title"
  >
    <!-- SQL Tab -->
    <SqlEditorContent v-if="tab.type === 'sql'" :tab="tab" />
    
    <!-- 结构Tab -->
    <StructureContent v-else-if="tab.type === 'structure'" :tab="tab" />
  </a-tab-pane>
</template>

Tab标题样式

  • SQL Tab查询 1查询 2
  • 结构Tab结构: database.table(使用不同颜色或图标区分)

Tab关闭逻辑

  • SQL Tab可以关闭最后一个不可关闭
  • 结构Tab可以关闭关闭时清除结构数据

4.2 方案三实现要点

子Tab管理

// 结构Tab状态
const structureTabs = ref<Array<{
  key: string
  title: string
  connectionId: number
  database: string
  tableName: string
  data: StructureData | null
}>>([])

const activeStructureTab = ref<string>('')

Tab切换

  • 查看新表结构时如果已存在则切换到对应Tab
  • 如果不存在创建新Tab并加载数据

五、用户体验对比

方案 多表查看 界面简洁 实现复杂度 用户习惯
方案一
方案二 ⚠️ ⚠️
方案三 ⚠️ ⚠️
方案四 ⚠️ ⚠️ ⚠️

六、最终建议

6.1 实现策略

阶段一P0

  • 实现方案一:结果面板"结构"Tab单表查看
  • 右键菜单:添加"查看结构"选项

阶段二P1

  • 扩展方案二:支持"在新Tab中查看结构"
  • 右键菜单:添加"在新Tab中查看结构"选项
  • SQL编辑器Tab区域支持结构Tab类型

阶段三P2

  • 考虑方案三结构Tab内部子Tab
  • 提供更好的多表对比体验

6.2 决策要点

  • 先实现方案一:满足基本需求,实现简单
  • 后续扩展方案二:提供多表查看能力,不影响现有功能
  • 未来考虑方案三:如果用户反馈需要更好的多表查看体验

结论先使用方案一单表查看后续根据用户反馈决定是否实现方案二SQL编辑器Tab或方案三结构Tab子Tab