Files
opsxdb/docs/DB-CLIENT-REVIEW.md
T
logan 2c0bfafd8d 同步完整源码至远程:扁平化重构现状 + 未入库源文件
- 补入库:server/internal/db/dump.go、redis 分页/扫描预算测试、opsxdb-mcp main_test、
  packages/opsxdb-mcp package-lock、docs 审计与对比文档等 37 个新文件
- 含结构扁平化进行中的 80 处修改与 155 处旧结构删除(server/ src/ src-tauri/ 为当前有效源)
- 构建产物(bin/target/dist)与签名私钥仍按规则排除
2026-10-16 03:47:33 +08:00

43 lines
9.6 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.
# 高频数据库操作评审:OpsxDB / DBX / DBeaver
更新:2026-10-15。依据当前工作区的 OpsxDB 根级 `src/`、`server/`,以及 `/Users/logan/devops/demo/db-gui/dbx`、`/Users/logan/devops/demo/db-client/dbeaver` 的源码和随库文档。**这是静态代码评审与产品取舍,不是三个桌面程序的同机实测,也不是所有驱动的兼容性认证。** 分数只针对日常关系数据库工作流;AI/MCP、Redis 等差异化能力在下文单列,不靠第三方插件数量加分。参考项目自身的文档陈述若未在本轮实测,以“源码中有路径”评价。
## 评分口径
每项满分是该列权重;一条功能只存在入口或说明但缺执行、错误恢复和验证时扣分。结果集“筛选已加载行”不等于数据库服务端过滤;限量 SQL 导出不等于可恢复备份。下表为评审判断值,允许在真库与桌面验收后修订,不能与 2026-10-14 的 [GUI 布局评分](GUI-COMPARISON.md)混用。
| 维度(满分) | OpsxDB | DBX | DBeaver | 主要判断 |
|---|---:|---:|---:|---|
| 连接、对象树与上下文(15) | 12 | 14 | 14 | OpsxDB 已有多连接、库/表/列及索引/外键/触发器目录和带库标签;PG Schema 与真实驱动目录仍需验收;两参照项目对象导航与目标上下文更完整 |
| SQL 编辑、会话与事务(20) | 11 | 18 | 18 | OpsxDB 有选区/当前语句执行、格式化、历史、切库、取消与危险确认;尚无可靠跨请求手动事务;DBX 有标签专用事务会话,DBeaver 有自动提交切换和事务监视 |
| 表设计与数据编辑(20) | 12 | 18 | 19 | OpsxDB 有字段/主键、MySQL 普通索引设计及有主键的单元格改/删;缺新增行、批量暂存提交、外键编辑,PG/SQLite 索引只读;参照项目有更完整的编辑持久化路径 |
| 导入、导出与恢复(20) | 7 | 18 | 18 | OpsxDB 有结果与整表导出、单表 SQL 三态转储,缺 CSV 导入、完整备份与恢复;DBX 有表导入、数据传输和 MySQL/PG 备份,DBeaver 有数据传输向导与 MySQL/PG 原生备份向导 |
| 结果集高频交互与大数据(15) | 11 | 13 | 13 | OpsxDB 有复制/右键、局部筛选排序、分页与继续显示,但服务端按 offset 丢弃前面行;两参照项目有更丰富的过滤、行状态与任务反馈 |
| 失败反馈、回归证据与操作安全(10) | 5 | 7 | 9 | OpsxDB 有危险确认与部分单测,桌面及真库矩阵尚未闭环;DBX 有事务/导入/比较专门回归,DBeaver 的持久化器含行标识校验、部分提交与回滚处理。此项不代表本轮运行了第三方测试 |
| **合计 / 100** | **58** | **88** | **91** | 能力覆盖与闭环成熟度的当前估计,不是视觉评分或性能基准 |
OpsxDB 的优势是轻量的连接→对象→查询主路径、Redis 键操作、Ask/Agent 与 MCP 同一会话工具边界;后两项没有纳入上述关系库同口径打分。DBeaver 覆盖广而操作层级多;DBX 的步骤式迁移和上下文入口值得借鉴。OpsxDB 应保持日常操作短路径,复杂任务才进入向导。
## 对照后最值得补的能力
| 频率 / 优先级 | OpsxDB 当前缺口与影响 | 参考代码证据 | 适合 OpsxDB 的实现范围 |
|---|---|---|---|
| 高频 P0:新增/修改/删除一批数据 | `src/ResultPane.tsx` 有主键写回和删除,空输入转 NULL,单元格写入立即提交;没有新增行与可查看的待提交改动。粘贴多格失败时需明确哪些已写入,不能用旧结果覆盖后来的成功写回 | DBX `apps/desktop/src/lib/dataGrid/dataGridContextMenu.ts` 有 clone/restore/delete、NULL/筛选操作;DBeaver `plugins/org.jkiss.dbeaver.ui.editors.data/.../ResultSetPersister.java` 区分 insert/update/delete,并对缺少唯一行标识拒绝删除 | 先做“新增行、显式 NULL、改动预览、保存/撤销”;事务支持前明示逐行立即生效和部分失败。限制表来源与主键,避免任意 JOIN 结果写回 |
| 高频 P0:导入 CSV 到已有表 | 无数据导入向导;手工写 INSERT 成本高,易错 | DBX `crates/dbx-core/src/data/table_import.rs`、`crates/dbx-web/src/routes/table_import.rs` 与 `docs/content/docs/table-import.cn.mdx`;DBeaver `plugins/org.jkiss.dbeaver.data.transfer.ui/.../DataTransferWizard.java` | 从表右键进入,文件预览→编码/表头/分隔符→字段映射与 NULL→目标复核→分批写入/进度/取消/错误行;先支持 MySQL/PG/SQLite 的 CSV,测试事务及失败行语义 |
| 高频 P0:可控事务 | `server/internal/db/session.go` 按库缓存 `*sql.DB` 连接池,`server/internal/db/ops.go` 每次通过池执行;连发 `BEGIN`、DML、`ROLLBACK` 不能保证同一物理连接。前端没有会话绑定的提交/回滚状态 | DBX `crates/dbx-core/tests/live_manual_transaction.rs`、`apps/desktop/src/components/layout/EditorToolbar.vue`;DBeaver `plugins/org.jkiss.dbeaver.core/.../DataSourceTransactionModeContributor.java` 与 `.../TransactionMonitorToolbar.java` | 先设计每查询标签独占 `*sql.Conn`/`*sql.Tx` 的本机事务句柄,再开放手动模式和提交/回滚。连接/库切换、关闭标签、超时、取消、断连与提交响应未知均有状态处理;事务内不隐式重试。MySQL DDL 的隐式提交单独提示。不能先只加按钮或直接发送 BEGIN |
| 高频 P1:备份与恢复 | `server/internal/db/dump.go` 仅单表 SQL 转储;整表 CSV/JSON 上限 500000 行,达到上限未明确是否截断;没有整库一致性备份、依赖顺序或恢复验证 | DBX `docs/content/docs/database-backup.cn.mdx`、`crates/dbx-core/src/scheduled_backup/engine.rs`;DBeaver `plugins/org.jkiss.dbeaver.ext.mysql.ui/.../MySQLExportWizard.java`、`plugins/org.jkiss.dbeaver.ext.postgresql.ui/.../PostgreBackupWizard.java` | 先 MySQL/PG 手动逻辑备份,列出范围、对象与输出文件并做空库恢复演练;查询导出达到上限明确标注不完整。定时与保留策略后置,桌面退出不承诺继续运行 |
| 中频 P1:表设计变更可靠性 | 设计器有 DDL 预览,但读取后到应用前未重新校验结构;MySQL 索引支持常见类型,PG/SQLite 索引与外键只读 | DBX `crates/dbx-sql-schema/src/table_structure_sql/`、结构编辑器的验证与 SQLite 重建路径;DBeaver 对象属性编辑路径 | 先校验元数据版本/快照与实际目标,处理复合主键和默认值;PG 普通索引、外键在真库验收后分方言开放。危险 DDL 展示影响与失败后的状态,不追求一次支持所有约束 |
| 中频 P1:服务端筛选和高效翻页 | `src/ResultPane.tsx` 的筛选/排序作用于已加载行;`server/internal/db/ops.go` 的 offset 在结果扫描中逐行跳过,深页成本增长,重跑查询可能读到变化后的数据 | DBX `apps/desktop/src/lib/dataGrid/dataGridContextMenu.ts` 的筛选菜单与数据网格;DBeaver 结果集查看/编辑组件 | 表数据增加列条件筛选与稳定排序,清楚标示“当前页”或“全表”;按方言生成带 LIMIT/OFFSET 的安全查询,深页考虑主键游标。不将任意 SQL 重写成服务端过滤 |
| 中频 P1–P2:比较/迁移 | OpsxDB 无结构比较/数据比较、跨连接传输;SQL 文件导入也未形成完整解析和进度路径 | DBX `crates/dbx-core/src/data/data_compare.rs`、`apps/desktop/src/components/diff/DataCompareDialog.vue`、`crates/dbx-core/src/data/transfer.rs`;DBeaver `plugins/org.jkiss.dbeaver.cmp.simple.ui/.../CompareObjectsWizard.java` | 先做只读结构差异;数据比较限定同构、唯一键、行数上限并展示样本;跨库传输与同步等 CSV 导入/备份闭环后再排期 |
路径中 `...` 表示相应插件包内的 `src/org/jkiss/dbeaver/` 前缀,并非 OpsxDB 文件。完整库/表缺项及现有功能参阅 [DATABASE-OPERATIONS-AUDIT.md](DATABASE-OPERATIONS-AUDIT.md)。DBX 表导入文档与核心实现对应,但其 SQL 导入限定字面量 INSERT,不能据此推断任意 SQL 脚本恢复已经通用可用;“可导出 SQL”也不能推断“已验证可恢复”。
## 项目决策与验收门槛
1. **先补可信的数据操作**:表网格新增行和明确 NULL;校验主键、唯一行定位、并发变化与多行部分失败。若暂存/批量保存需依赖事务,先把服务器独占连接与标签生命周期打通,再显示“保存/撤销”;与普通 SQL 的手动事务可以共用句柄层,UI 保持简单。
2. **CSV 导入做一条完整路径**:从表右键进预填目标的向导,不加额外主工具栏按钮。测试 UTF-8/GBK、引号换行、空串与 NULL、自增/默认字段、重复键、取消、断连和错误行定位;明确每批是否已提交,输出成功/跳过/失败行数。
3. **加固现有出口**:整表导出区分“达到行上限”与“完整”;导出失败/取消不留下貌似成功的文件。随后再做 MySQL/PG 的单次整库备份与空库恢复演练,备份内容与对象范围可核对。
4. **依赖真库的结构工作随后做**:MySQL 8.4/MariaDB 11/PG 16/SQLite 的新建→改字段/主键/索引→刷新/重连、并发结构变动、无权限和特殊标识符。结构比较先只读;数据比较、XLSX、跨连接复制、定时任务为后续选项。
本次只读核查三份本地源码,未运行 DBX、DBeaver;未将 OpsxDB 桌面视觉/右键或 MySQL/Redis Agent 真库测试记为通过。当前 Computer Use 访问 OpsxDB 曾被自动审批拒绝,且此前隔离环境不能连接本机数据库;这些验收应在可访问的本机桌面环境补做。此评审不改变 `homepage/` 或产品形态:官网与文档在浏览器,数据库操作仍只走 Tauri 桌面。