暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 表层次结构:Oracle NoSQL 数据库的隐藏瑰宝

原创 刺史武都 2025-03-28
16

本篇博文将引导您完成父子数据结构的建模、识别其优势并探索不同的用例。本篇博文介绍了表层次结构的概念和优势,通过示例构建了模型,并说明了层次结构在分片级别的工作原理。

介绍

现代应用程序的开发人员不断受到企业的挑战,这些企业试图通过高度响应和丰富的用户体验来赢得市场份额并取悦客户。 以低延迟提供大规模数据需要数据库系统能够按需扩展以满足极端工作负载。这样的挑战催生了 NoSQL 数据库的水平扩展承诺,并将工作负载分布在商品计算资源池中。具有键值、文档和列式风格的 NoSQL 数据库对数据进行分区,并将分区分布在集群的节点上,以实现水平扩展。

然而,与 RDBMS 相比,卓越可扩展性的承诺是以牺牲规范化数据关系为代价的。在 NoSQL 数据库领域,存储非规范化数据是理所当然的,甚至许多供应商都建议这样做。事实上, NoSQL 架构的底层分布式特性使其非常适合可扩展性任务。它快速而高效。但是,跨分布式分区连接数据的成本过高,并且与可预测、低延迟和可扩展性的目标相冲突。

Oracle NoSQL 数据库中的隐藏宝石打破了这一常规,在保持数据关系的同时提供了高可扩展性。

NoSQL 表层次结构是适合那些需要一定数据规范化,但也需要可预测、低延迟的应用程序的理想数据模型。层次结构链接不同的表以启用左外连接,根据两个或多个表之间的相关列组合它们中的行。由于父子表中的行位于同一个分片中,因此此类连接执行效率很高。此外,对表层次结构中多个表的写入遵循事务 ACID 属性,因为层次结构中每个表中的记录共享相同的分片键。所有写入操作都作为单个原子单位执行。因此,所有写入操作都将成功执行,或者都无法执行。

为什么使用 Oracle NoSQL 数据库表层次结构

许多 NoSQL 数据库支持数组和映射等数据类型。在对数据关系进行建模时,应用程序开发人员可能会发现让每个父行将其子行存储在嵌套结构中的数组或映射中会更容易。这样做不仅会使数据关系非规范化,而且还可能会创建较大的父行,尤其是在层次结构嵌套严重的情况下,从而导致存储效率低下和性能不佳。Oracle NoSQL Database 的表层次结构是避免与数组和映射相关的问题的理想数据模型。在 Oracle NoSQL Database 中构建数据关系时,应考虑使用表层次结构。

表层次结构的好处

Oracle NoSQL 数据库表层次结构具有以下优点:

  • 在父子层次结构中存储数据非常高效- 父行和子行存储在单独的 NoSQL 表中,与单个父行和嵌套数组或映射中的子行相比,父行的大小有所减少。鉴于 Oracle NoSQL Database 的追加式架构,对父行或子行的写入操作会创建较小行的新版本并高效存储这些更改。
  • 读写工作负载的高性能- 父行和子行位于同一个本地分片中,使写入和读取操作能够实现高性能,因为层次结构中的所有记录都可以在单个网络调用中读取或写入。
  • 高度灵活,可进行细粒度授权- 可以根据运行时条件单独配置对父表或子表的访问权限,提供细粒度和灵活的授权。
  • 可扩展的 ACID 事务- 通过将父数据和子数据放置在同一个分片上,以独特的方式平衡了可扩展性、低延迟和 ACID 的目标。
  • 表连接- 可以使用嵌套表子句或左外连接查询数据。

Oracle NoSQL 数据库如何使用父子表构建表层次结构模型

表层次结构由通过父子关系连接的表树组成,使用 CREATE TABLE 语句形成。这是通过使用子表的复合名称 (name_path) 来实现的。复合名称由多个 (> 1) 个用点分隔的标识符组成。最后一个标识符是本地子表的本地名称,前 N-1 个标识符是父表的名称。

举一个简单的例子,父子表由用户 ID 和名称组成,其中 id 为主键。以下 CREATE TABLE 语句形成一个表层次结构。表 A 是所有子表的根(父级)。表 B 是 A 的直接子表。表 C 是 B 的直接子表,也是 A 的孙表。表 G 是 A 在不同树分支中的直接子表。每个 CREATE TABLE 语句都单独执行以形成一个表及其与其他表的关系。对于根表(表 A),分片键 idA 与主键相同。在 Oracle NoSQL 数据库中,默认行为是分片键映射到整个主键。每个表都有一个可以显式或隐式定义的分片键,如本例所示。
image.png
完成上述 CREATE TABLE 操作后,我们来进一步详细了解父子关系的构造。CREATE TABLE 语句形成以下表层次结构:
image.png
image.png
让我们探索下面每个表的架构。首先,请注意子记录会自动继承其父级的分片键。以下以绿色突出显示的文本表明,在父表 A 中,分片键为“idA”,主键为“idA”。
image.png
以下以绿色突出显示的文本表明,在子表 AB 中,分片键 =“idA”,它是从其父表 A 继承的。主键包含“idA”(作为父分片键)和“idB”。

image.png
ABC 也是如此。以下绿色突出显示的文本表明,在表 ABC 中,分片键 = “idA” 是从其父表 A 继承而来的。主键包含 “idA”、 “idB”、 “idC”。AG 也是如此
image.png
表层次结构的实际用例
许多航空公司为乘客提供实时行李跟踪自助服务。乘客在手机上安装应用程序,以便在飞行期间监控行李的下落。除了 Oracle NoSQL Database 支持的流行 JSON 文档模型之外,让我们说明表层次结构如何为规范化数据关系建模提供另一种方法。

下面是一个示例 JSON 文档,其中记录了乘客资料、行李及其位置。机票号(“ticketNo”)、行李 ID(“id”)、航班号(“flightNo”)是追踪行李的关键标识符。下面的示例文档仅追踪一个行李。如果仅追踪三个行李,文档大小会大幅增加。
image.png

让我们将 JSON 文档拆分成不同的表,并对数据进行规范化。左侧文档转换为右侧的四个表。每个表包含文档中的不同数据。父子键为“ticketNo”、“contactPhone”、“id”和“flightNo”,其中“ticketNo”为父键(或分片键)。
image.png

父子关系如下所示,其中“ticket”表为父表,“bagInfo”表为子表,“flightLegs”表为同一层次结构中的孙表。“passengerInfo”表是“ticket”父表的子表,位于单独的层次结构中。父子键“ticketNo”、“id”、“flightNo”、“contactPhone”将这些表链接在一起,形成表示规范化数据关系的层次结构。
image.png

按照步骤,逐步介绍创建表层次结构的命令,并展示它们的关系,类似于博客开头显示的步骤。加载数据和查询步骤说明了将记录写入表层次结构并执行左外连接。我将在本系列即将推出的第 2 部分中进一步深入介绍这些步骤。

image.png

使用简单示例深入探究 Oracle NoSQL 表层次结构

在使用上面的航空行李跟踪用例对表层次结构进行令人惊叹的说明之后,让我们回到本博客开头使用的下面简单的表层次结构示例。此示例使我们更好地理解了表层次结构概念。在下一篇博客中,我将再次使用航空行李跟踪数据来探索表层次结构中的查询。

image.png

让我们继续深入探究构成表层次结构的底层结构。您可以使用以下映射轻松地将表 A、AB、ABC 和 AG 映射到航空行李跟踪用例。
image.png

使用CREATE TABLE语句构建表层次结构。要将表 A 和表 B 链接起来,将 A 作为父表,将 B 作为子表,可使用CREATE TABLE AB构建这种关系。表 A的主键“ idA ”会自动在子表 B中创建为隐式键。通常,主键的分片部分是在子表中创建的。在本例中,由于我们没有指定主键的一部分作为分片键,因此整个主键都会在子表中创建。要将表 A、B 和 C 链接成层次结构,可使用 CREATE TABLE ABC,表 A 和 B 的主键会自动在表 C 中创建为隐式键。由于表 A 是所有子表的父表,“ idA ”成为对所有父子记录进行分区的分片键。

NoSQL 表层次结构中的隐式键与关系数据库中用于建立关系的外键同义。

image.png

让我们用每个父子关系的值填充表。父子表的名称路径(例如 AB、ABC、AG)用于指定要写入值的表。不同的路径需要不同数量的主键来将父子行链接在一起,例如,子表 AB 中主键值为“2”,“2”的行与父表 A 中主键值为“2”的行建立父子关系。表 ABC 行需要主键“2”,“2”,“2”来与表 A、AB 中的上述行建立父子关系

image.png

一旦所有父子表的写入操作完成,表层次结构将包含下图中的行值和父子关系。

父子表的名称路径(例如 AB、ABC、AG)用于指定要写入值的表。不同的路径需要不同数量的主键将父子行链接在一起,例如,子表 AB 中主键值“2”,“2”的行与父表 A 中主键值“2”的行建立父子关系。表 ABC 行需要主键“2”,“2”,“2”才能与表 A、AB 中上方的行建立父子关系一旦所有父子表的写入操作完成,表层次结构将包含下图中的行值和父子关系。为了方便查看,我们将表层次结构水平放置。

表层次结构的工作原理

Oracle NoSQL 数据库集群由一组存储节点组成,每个节点托管一个或多个复制节点。这些节点被组织成分片。单个分片包含多个复制节点和一个领导节点。分片键在 CREATE TABLE 语句中标识,用于将数据分布在不同分片之间。具有相同分片键的记录位于同一位置,以便于引用和访问。

下图显示了 Oracle NoSQL 数据库如何根据分片键分配行。后面的部分将使用示例数据说明此实现,以展示父子行如何分布并共存于同一分片中。在此之前,让我们深入了解父子关系的语义。

image.png

表层次语义

以下是亲子关系的语义含义:

子表继承其父表的主键列- 如上所述,这是隐式完成的,而不在子表的创建表语句中包含父列。
层次结构中的所有表都具有相同的分片键列- 分片键从根表继承而来。在上面的示例中,公共分片键是表 A 的列“idA”。由于分片键列是主键列的子集,因此根据定义,子表也会继承分片键。尝试在非根表的创建表语句中包含分片键子句将引发错误。
不能在删除子表之前删除父表- 必须先删除子表,然后再删除父表,以免破坏表层次关系。在上面的示例中,删除表 AB 而不删除表 ABC 会引发错误。
父行和其子行位于同一位置,因为它们的分片键匹配- 当子表 C 和其父表 P 中的两行 RC 和 RP 在其公共主键列上具有相同的值时,RP 和 RC 将在物理上位于同一位置,因为它们具有相同的分片键。

父子行如何分布和共置

下图说明了具有父子关系以及父行和子行共置的表层次结构。

使用前面的示例表层次结构,SQL 命令:“desc as json table <父/子表名称>”显示表 A、B、C 的以下架构描述及其主键和分片键。这种隐式主键和分片键共享在层次结构中建立了父表和子表之间的联系。

image.png

使用前面的示例数据和下图,让我们探索如何将父行和子行绑定在一起、分布在各个分片中以及如何共存于同一个分片中。

当两行共享一个或多个公共主键值时,就会建立父子关系。例如,表 A 中主键(“idA”)值等于“2”的行与表 AB 中共享相同的主键(“idA”)值。表 AB 和表 ABC 中的行之间也建立了类似的父子关系,其主键(“idA”)和(“idB”)值等于“2”和“2”。通过这种联系,就诞生了一个包含一个根父级、一个子级和一个孙级的行的表层次结构。

image.png

父子行根据根父级的分片键(“idA”)值分布在 NoSQL 分片中。为简单起见,假设父表 A 的分片键值经过哈希处理,以将父子行分布在分片 1、2、3 之间。下表显示了根父级分片键与 Oracle NoSQL 数据库的映射:

image.png

下图说明上述示例父子行存储在 Oracle NoSQL 数据库分片 #2 中,因为根父表 A 的分片键(“idA”)等于“2”。
image.png
我们可以在下图中通过在分片 1、2、3 中插入​​行来扩展这个想法。分片中的每个父子行都会在多个存储节点之间复制,以提供高可用性和高性能的读写操作。

通过将父子行共置在同一个分片中,开发人员可以实现事务操作。父子行中的所有数据都可以作为单个数据库操作提交,以确保原子性、一致性、隔离性和持久性 (ACID)。

现在,您明白了为什么表层次结构是 Oracle NoSQL 数据库中的一颗隐藏的宝石。

结论

要点是,NoSQL 表层次结构不仅可以捕获数据实体之间的关系,还可以利用父子行的共置来提供高性能检索和卓越的可扩展性。另一个要点是,表层次结构使应用程序能够实现 ACID 事务。同一父子行中的所有数据都存储在同一个分片中,并且可以作为单个数据库操作提交,以确保原子性、一致性、隔离性和持久性。

暂时先尝试一下所有示例。您可以在Oracle NoSQL Database Cloud Service上尝试。或者,在不到 1 分钟的时间内下载并安装Oracle NoSQL Database 。

下载和安装完成后,使用以下命令在几秒钟内启动 Oracle NoSQL 数据库的精简版本 KVLITE:

  java -jar <您的 KVHOME 目录>/lib/kvstore.jar kvlite -secure-config disable
复制

您可以使用以下命令开始使用 SQL shell 并运行所有示例:

  java -jar <您的 KVHOME 目录>/lib/sql.jar -helper-hosts localhost:5000 -store kvstore
复制

原文地址:https://blogs.oracle.com/nosql/post/table-hierarchy-the-hidden-gem-of-oracle-nosql-database—part-1
原文作者:Tim Goh

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论