db-tree:搜索和导航数据库


db树徽标 在这篇文章中,我将讨论一种用于快速查找数据库中的行并进行导航的工具。 如果您在支持部门工作并且必须进行很多数据库查询,那么如果您厌倦了编写SELECTs,请在目录下进行。

动机


前一段时间,我帮助维护了一个大型会计系统。 在工作过程中,需要在数据库上搜索信息。 典型场景:有问题的用户请求N1。 为了进行诊断,您需要在数据库中查看有关此应用程序的一些数据。 我们满足要求:

SQL SELECT * FROM ORDER WHERE ID = 'N1' 

该单元与应用程序相关联,因此,我们执行以下请求以获取有关该单元的信息:

 SQL SELECT * FROM DEVICE WHERE ORDER_ID = 'N1' 

然后,我们查找与该单元有关的所有应用程序:

 SQL SELECT * FROM ORDERS WHERE DEVICEID = '92375' 

依此类推。 执行N个查询后,我们迟早会在数据中发现问题并采取措施。 这种方法的缺点很明显:

  • 手动编写查询速度慢且不便。 特别是如果数据库结构复杂并且有很多表。 因此可以修改隧道综合症。
  • 当您需要通过唯一性约束或外键查找相关行时,必须编写一个新查询。
  • 通常,数据库工具以表格形式显示数据。 当表中有很多列时,您必须水平滚动表,或在查询中选择列。 同样,需要手动操作。

主意


首先,您需要简化搜索。 该操作应以最少的点击次数执行。 只需在文本框中输入所需的行,然后按Enter。 通常,主键已建立索引,因此您可以立即在“主键”或“唯一约束”中包含的所有列中搜索值。

然后,您需要解决导航问题。 如何快速跳转到外键上的相关条目? 您可以将数据库视为文件系统:假设数据库行是目录,外键的相关行是符号链接,而不是外键的字段是简单文件。 我不会编写文件系统驱动程序,这只是一个类比。 因此,数据库行可以表示为层次结构,可以使用TreeTable组件显示。

您还可以在TreeTable组件中添加一列,其中将显示给定行的一些有意义的值。 可以通过串联数据库行字段的值来获得此值。 例如,对于订单行,您可以创建一个表达式:
 ORDER_NAME + ', ' + ORDER_STATUS + ', ' + ORDER_CUSTOMER 

最接近的类比:java中的toString()方法。

实作


编程花了好几个月的时间。 最初,我尝试使用C ++和Qt,但事实证明这很困难:在C ++世界中,没有什么与jdbc驱动程序相似,并且语言本身更加复杂。 因此,该应用程序是用Java编写的。

主视窗

在屏幕截图中,我们看到了搜索字段,用于切换当前连接的组合框以及显示分层数据的TreeTable组件。

搜寻


您可以在文本框中输入字符串,然后按Enter。 现在,搜索仅适用于字符串和数字类型的列:VARCHAR,NUMBER等。尚不支持日期和时间类型。 默认情况下,该工具在“主键”中包含的列中搜索值。 在设置中,您可以勾选搜索中将使用的其他字段。

按键导航


标有[F]的节点是外键。 在“表”列中,我们看到此键引用的表的名称。 打开节点后,我们继续到相关行。 还支持复合外键。

标有[U]的节点是唯一约束或主键。 扩展节点后,您可以转到相关行。 看一下屏幕截图:

转到UniqueConstraint链接的针

我们在搜索栏中输入值10248,并在ORDERS表中找到一行。 我们打开[U] ORDER_ID节点,并在ORDER_DETAILS表中找到3行。 然后,您可以展开每个节点并转到ORDER_DETAILS表的行。

列字符串


主键值通常无用。 在上一个屏幕截图中,我们看到值ORDER_ID = 10248,PRODUCT_ID = 11。 这些数字没有告诉我们任何事情。 要以某种方式使其人性化,可以表达:

 'Product: ' + PRODUCT_ID.PRODUCT_NAME + ', Price: ' + UNIT_PRICE 

并将其输入到“字符串”列的单元格中:

字符串表达式

按Enter键,然后查看更多有意义的值:

字符串表达式结果

技术细节


该应用程序是用Java(JavaFX的接口)编写的。 您可能会注意到TreeTable使用字符串“ [U]”和“ [F]”而不是图标,这是由于以下令人讨厌的错误: JDK-8190331造成的 。 使用java-keyring库将数据库密码存储在安全的存储库中。 OpenJDK 13和早期访问的build jpackage用于构建安装程序 。 编译命令可以在这里找到。

现在支持Oracle,MariaDB和PostgreSQL数据库。

参考文献


github上的项目页面: db-tree-fx

如果发现错误,或需要添加一些内容,请随时开始发行或直接写到邮件db.tree.app@gmail.com

安装包


适用于GNU / Linux的Rpm: db-tree-0.0.2-1.x86_64.rpm
适用于GNU / Linux的Deb: db-tree_0.0.2-1_amd64.deb
为macOS签名的dmg: db-tree-0.0.2.dmg
Windows的已签名MSI: db-tree-0.0.2.msi

最新版本可以在github上找到

Source: https://habr.com/ru/post/zh-CN478638/


All Articles