Qddb 数据库套件

作者:Eric H. Herrin II

您是否曾经需要一个程序来管理一些数据?也许您尝试过许多关系数据库产品中的一种,这些产品需要大量精力来设置一些简单的表,并且想知道为什么没有一个易于使用的产品。

在查看现有数据库产品的设计时,请注意大多数工具都非常笨重。您必须仔细定义您的字段,选择那些需要单独表的字段,定义表之间的链接字段,选择用于搜索的重要字段,然后最终构建某种界面。在许多情况下,人们决定使用平面文件,因为真正的数据库太耗时了。许多任务可以从一个使设计简单数据库变得容易的程序中获益匪浅。

什么是 Qddb?

Qddb 是一个多用户数据库套件,允许您快速设计自定义数据库。如果您知道数据库应包含的数据,您可以设计数据库并启动并运行,速度几乎与您键入字段名称一样快。怀疑吗?让我们完成一个示例。

构建 Qddb 数据库有两个基本步骤。首先,您必须使用 Qddb 的 qnewdb() 命令创建一个空白数据库

bash$ qnewdb Properties

qnewdb() 构建一个新的数据库目录(在本例中命名为 Properties),并用几个文件填充它以供 Qddb 使用。接下来,您必须编辑 Properties/Schema 文件并定义单个记录的格式

# This is a comment
# Qddb Schema file for a landlord's property
# database
 Street City State ZipCode
 Apartments (
 AptNumber type integer
 Rented defaultvalue "N"
 Lease (
 Begin type date # start date of lease
 End type date  # end date of lease
 )
 Person (
 First Middle Last ID
 PrimaryRenter defaultvalue "Y"
 )*
 Comments*
 )*
您注意到的关于 Schema 文件的第一件事是它的自由格式。每个单词(除了关键字 typedefaultvalue 后跟数据类型或字符串)定义记录中的一个字段。默认情况下,记录中每个字段的值可以包含任意长度的字符串。您还可以显式地为每个字段分配 stringrealintegerdate 的数据类型。

有些字段是 结构化 的,也就是说,它们包含其他字段。例如,Apartments 包含子字段 AptNumber、Rented、Lease、Person 和 Comments。Apartments.Lease 和 Apartments.Person 也是结构化的,并包含子字段。

有些字段是 可扩展 的,这意味着数据库中的每个记录可以包含该字段的多个值。可扩展字段在其定义的末尾用星号 (*) 表示。

上面的示例 Schema 定义了一个数据库,该数据库为房东拥有的每个房产包含一条记录。每个房产包含多个公寓。每个公寓都有一个号码、是否已出租、租赁日期、居住在那里的人员列表和评论列表。

nxqddb()——Qddb 的通用数据库浏览器

现在,您可以使用 Qddb 的通用基于 X 的应用程序 nxqddb 来使用您的 Properties 数据库了。

nxqddb Properties

图 1. 标准 nxqddb 屏幕

图 1 显示了 Properties 数据库的标准 nxqddb 屏幕。启动后,nxqddb() 允许您

  • 添加新记录

  • 搜索记录并查看结果

  • 修改记录

  • 删除记录

  • 生成信件、明信片、电子邮件、报告、条形图和图形

要添加记录,请选择“模式”菜单按钮并选择“添加模式”。进入“添加模式”后,您可以简单地填写字段。如果要为可扩展字段添加多个值,您可以单击字段标签旁边的“添加”按钮。您还可以通过单击“查看”按钮来查看可扩展字段中的所有值。当您准备好保存记录时,选择“文件”菜单按钮并选择“保存”。现在您可以准备添加另一条记录了。请注意,默认情况下,Qddb 不会清除下一个记录的输入框;如果您想要这种行为,您可以在配置菜单下选择 自动清除

添加一些记录后,您可以转到“搜索模式”并执行简单、快速的数据库查询。例如,假设您想查找所有租公寓且名字为 Sally 的人。只需在 Apartments.Person.First 输入框中键入“sally”并按 回车键。如果您想进一步缩小搜索范围,查找姓氏为“Jones”的人,请在 Apartments.Person.Last 字段中键入“jones”并按 回车键。所有符合条件的房产列表将显示在“搜索结果”窗口中,如图 2 所示。如果要编辑其中一条记录,请单击该条目,您将切换到该记录的“更改模式”。

图 2. 搜索结果窗口

您会很快发现,默认情况下,Qddb 将字段值拆分为可搜索的组件。分隔符 是一个字符,用于分隔字段中可搜索的组件。您可以为架构中的任何字段指定自己的分隔符集

MyField separators ",.;"

上面的分隔符架构选项告诉 Qddb 仅使用分隔符“,”(逗号)、“.”(句点)和“;”(分号)来索引字段 MyField。默认分隔符列表包括所有 ASCII 非字母数字字符。(请注意,只有 string 类型的字段使用分隔符。)

Qddb 的简单搜索机制支持范围、正则表达式、数字和日期。功能齐全的专家搜索和报告生成器完善了 Qddb 的搜索功能。

如何配置搜索结果

现在,您已经知道如何执行简单搜索,您可能希望在结果中添加或省略某些字段。默认情况下,nxqddb 仅在搜索结果窗口中显示前五个字段。

如果您单击“配置”菜单按钮,您会注意到许多配置选项。这是您所有 nxqddb 设置的当前状态。搜索结果配置(参见图 3)确定搜索结果中存在的字段、这些字段的显示方式以及显示顺序。您还可以向搜索结果添加用户定义的列。

图 3. 搜索结果配置窗口

配置搜索结果后,您可以选择保存配置。nxqddb 在启动时识别两个配置:全局配置和个人配置。全局配置是特定数据库的任何用户的默认配置。个人配置覆盖单个用户的任何全局设置。

专家搜索

虽然简单搜索机制对于快速查找非常方便,但它无法执行所有类型的搜索。专家搜索旨在处理通用搜索,并包括保存搜索条件以供以后使用的功能。图 4 显示了专家搜索窗口。从此窗口中,您可以以任何您喜欢的方式组合和嵌套查询。范围使用两个输入框;其他搜索类型仅使用最左边的输入框。

图 4. 专家搜索窗口

假设您想查找所有主要租户,他们的租约在本月到期。我们的想法是向专家搜索引擎提供搜索条件列表。那么我们的搜索应该是所有 Apartments.Person.PrimaryRenter == “Y” 和 Apartments.Lease.End == “@firstofmonth(this month)-@lastofmonth(this month)”。

专家搜索窗口始终包含至少一个搜索条件字段。要将我们的搜索限制为上面指定的特定字段,我们单击输入框旁边的向下箭头,选择 Apartments.Person.PrimaryRenter 作为属性名称并关闭下拉菜单,然后在输入框中键入 Y。现在我们必须指定第二个条件,所以我们

  1. 单击“追加节点”按钮以添加新条目。

  2. 单击向下箭头以选择 Apartments.Lease.End 属性上的日期范围搜索。

  3. 关闭菜单。

  4. 在左侧输入框中键入 @firstofmonth(this month),在右侧输入框中键入 @lastofmonth(this month)

现在,我们可以单击“搜索”按钮,我们将看到一个搜索结果窗口,其中包含使用当前搜索结果格式的所有匹配行。

生成报告

可以通过执行以下两个步骤轻松生成临时报告

  1. 配置搜索结果。

  2. 执行简单或专家搜索。

更详细的报告需要 Qddb 报告生成器。Qddb 报告生成器可以生成明信片、信件、电子邮件、数字字段摘要、图形、条形图和表格。基本思想与生成临时报告相同,但您通常希望保存搜索条件和结果格式的设置以供以后使用。

图 5. 报告生成器窗口

图 5 显示了报告生成器的主窗口。从此窗口中,您可以定义多个专家搜索和一个搜索结果配置。在定义您想看到的内容以及您想如何看到它之后,您可以选择六种输出格式中的任意组合。

例如,假设我们想向每个租约在本月到期的租户发送一张明信片。首先,我们需要配置回邮地址和目的地地址的格式。在“配置”菜单按钮下选择“报告格式默认值”选项。您会注意到级联菜单中的两个选项:回邮地址和目的地地址。选择“回邮地址”并填写您希望它出现在明信片和信件上的回邮地址。接下来,选择“目的地地址”。此选项将格式化所有明信片和信件上的目的地地址的任意字段。配置完地址后,您可能希望保存您的配置,以便这些选项成为默认选项。

我们已经了解了如何执行专家搜索,所以让我们只使用前面的示例来定义您想在报告中看到的内容。接下来,我们必须通过“结果格式”按钮定义报告的相关字段。要生成明信片,我们必须包含所有地址信息,此外我们可能还想包含租约的到期日期以包含在消息中。现在,我们可以选择我们希望生成的报告类型。如果您想要列表以及明信片,您可以同时选择这两个选项并单击“运行报告”按钮。由于我们选择了列表和明信片,因此列表首先出现并且可以打印出来。打印列表后,系统会提示您输入明信片消息,如图 6 所示。请注意,明信片消息通过使用每条记录中的数据为收件人个性化。

图 6. 明信片窗口

Qddb 和关系模型

在简单的情况下,Qddb 使用一组 元组树 而不是平面表。元组树只是来自一对多关系中关系表的预连接行的集合。也就是说,每条记录代表一个实体,并且每个实体对于字段的某个子集可以具有任意数量的值。更复杂的情况(例如多对多关系)可以使用一组 Qddb 架构来处理。

我们可以使用标准关系表来建模任何 Qddb 架构。例如,我们的 Properties 架构需要四个表:一个表用于地址信息,一个表用于每个可扩展字段。这些表需要大量的链接信息,以便连接行。

正是管理这些表的复杂性阻止了普通用户使用标准关系工具构建自己的数据库。即使是程序员也避免使用可以有多个值的字段,因为每个这样的字段都需要一个单独的表。使用 Qddb,用户和程序员可以通过简单地在架构中字段的定义后附加星号来允许任何字段有多个值。

关系模型要求字段值是 原子性 的。也就是说,在搜索时,字段值不能分解为更小的可搜索组件。默认情况下,Qddb 通过在分隔符处分解 string 类型的字段值来违反此规则。大多数用户并不关心关系模型,他们只是想完成他们的工作。有时这项工作包括在数据库中搜索特定记录。通过放宽此限制,Qddb 可以搜索文本字段(例如评论或摘要)中的单词。对于原子性很重要的字符串字段,您可以为该特定字段指定一个空的分隔符列表。

存储格式和索引

Qddb 使用几种有趣的存储技术。如果您查看数据库目录中文件的内容,您将看到所有 Qddb 数据和索引文件都存储为可读文本。“数据库”文件包含数据库稳定部分中每个记录的字段值。空字段不需要存储,并且从“数据库”文件中省略。

如果您浏览“数据库”文件,您还会注意到每个记录都是连续存储的。Qddb 的记录是来自架构中定义的关系表的预连接行。当您执行搜索时,“数据库”文件中的匹配元组树会扩展为等效的关系行以供查看。

Qddb 使用倒排索引进行搜索。当您执行搜索时,条件会快速转换为相应元组树的文件偏移量。然后,每个匹配的元组树都可以通过每个元组树一次磁盘读取从磁盘读取。

由于 Qddb 当前使用倒排索引进行索引,因此您应定期重新索引数据库,以便 Qddb 可以保持其速度。只有更改和添加存储在辅助位置,并且可以动态重新索引。qstall 命令用于此目的

qstall Properties

稳定后,所有更改、添加和删除都将提交到“数据库”文件。

历史和更多信息

资源

The Qddb Database Suite
Eric Herrin 是 1989 年 Qddb 第一个版本的共同创建者,此后一直指导其开发。他拥有肯塔基大学计算机科学博士学位,目前的研究兴趣包括操作系统和信息检索。可以通过电子邮件 eric@hsdi.com 联系 Herrin 博士。

The Qddb Database Suite
Gil Benson 是一位软件开发人员,拥有肯塔基大学计算机科学学士学位和泽维尔大学 MBA 学位。自 1989 年 Qddb 成立以来,他一直在使用 Qddb,可以通过电子邮件 gil@hsdi.com 联系他。
加载 Disqus 评论