JSON 和关系型表格各有优势和劣势。如何在工作中最大限度地发挥其优势,同时规避其劣势呢?
译自 JSON and Relational Tables: How to Get the Best of Both 。
JSON和关系型表格都是流行且极其有用的,它们都有自己独特的方式来组织应用程序中的数据。在我的同事 Chris Saxon 关于使用 SQL 管理 JSON 文件的热门文章之后,我想讨论一个重大发展,它可帮助开发人员在不受任一模型权衡的情况下处理关系表和JSON(JavaScript对象表示法)文档。
我先从关系模型开始,关系模型是一种通用模型,它使用数据规范化来确保数据完整性并避免数据重复。另外,SQL 使得数据访问、操作和建模灵活简单。关系模型与 SQL 相结合的优势在于其通用设计:您可以使用规范化技术将应用程序中的数据分解为独立的逻辑部分,并通过将这些部分存储在单独的表中。
想象一个学生的课程时间表。最简单的形式下,这样一个数据项包含四个部分的组合:a)该时间表所属学生的信息,b)学生想要参加的课程,c)课程的上课时间,d)上课的教室。每件信息对学生都很重要,告诉他们应该在何时何地,但关系模型会将这四个部分规范化到单独的表中。
为什么这个规范化很重要?因为它增加了数据在其他应用程序或目的上的可重用性。在这个例子中,教师也有时间表,与学生时间表看起来不同。教师关心自己讲授的课程及上课时间和教室。但教师时间表可能与学生时间表看起来非常不同,因为教师只教几门课,而学生可能还需要参加其他教师教授的许多课程。
接下来,考虑一下设施团队。他们可能不关心教师或学生,但他们非常关心哪些教室需要特殊设置。当课堂不使用时,他们也需要知道以安排维护。
多亏了关系模型和数据的规范化,所有这些问题都可以在不必对数据进行物理或逻辑重新结构化的情况下得到解答。
然而,虽然关系模型为我们提供了这个漂亮的通用设计,但对开发者来说使用起来并不总是最简单的。这是因为开发者通常以面向对象编程的方式构建应用程序,其中对象以层次结构组织成类,因此与规范化数据的行和列的想法不能自然对齐。
JSON 文档模型通过允许应用程序直接将对象映射到相应的分层 JSON 格式来克服关系模型的许多行和列的限制。这可以极大地减少对象关系映射的复杂性。
此外,JSON 是一种自描述数据格式,可以简化应用程序之间的通信,因为 JSON 文档不仅包含实际数据,还包含有关数据的信息 - 元数据或模式。然而,尽管 JSON 文档模型通过更紧密地映射到应用程序内部操作的面向对象性质为开发者带来了巨大利益,但它也不是理想的。
这里有一个弱点:由于 JSON 文档的自描述和分层性质,信息以冗余的方式存储,导致随后的低效和潜在不一致。
在调度示例中,如果设施团队由于漏水需要停用一个教室会发生什么?如果学生和教师时间表的数据都以 JSON 格式建模,每个学生和教师可能都有一个包含受影响教室冗余数据的 JSON 文档。
这些文档可能没有相同的结构:一个文档可能将学生信息作为根元素,而另一个文档将教师信息作为根元素。学生时间表文档可能包含每个课程教师的信息,但教师时间表文档可能不包含任何个别学生或联合教师的信息。
在这个例子中,设施管理应用程序将以某种方式传播教室更改,在结构不同的 JSON 文档中搜索教室并将其替换为另一个。虽然可行,但 JSON 为设施应用程序增加了复杂性,设施应用程序可以说根本不应该担心学生和教师时间表及其关联数据结构,而仅仅需要在未来两周内将 225 教室的所有内容映射到 316B 教室。
相比之下,如果数据以关系模型建模,则只有一个包含所有时间表的表 - 因此只需要更新一个表。所有三个应用程序,无论是学生、教师还是设施人员使用,都会自动一致地使用正确的数据。(当然,这个例子为简单起见,假设所有数据都在一个数据库或文档存储中。)
为了解决不一致的问题,一些 JSON 文档数据库建议使用引用规范化文档:不在学生或教师时间表文档中包含教室信息,而是在文档中简单地包含存储在另一个文档中的该教室的 ID。这个问题是,这种规范化文档的方式使 JSON 文档的工作类似于关系数据库,这完全打败了文档模型的简单性优势,现在开发者具有两全其美的模型。
顺便说一下,使用 JSON 文档模型难以建模多对多关系。尝试对关系建模会导致更大的数据重复和潜在的额外不一致。
开发人员绕过这些问题的不同方法,历史上开发人员经常使用对象关系映射(ORM)框架以分层面向对象的形式消费和操作关系数据库中的数据,同时保持数据本身的关系形式。
问题解决了吗?不。ORM 也不是完美的。它们添加了开发者难以完全控制的抽象层,通常提供自己的冲突或冲突解决方案,这可能合适也可能不合适,并且可能无法充分利用给定数据库引擎提供的所有功能。ORM 很快就会成为最低公分母,将应用程序进一步从数据和高效操作中抽离出来。
总结:
关系模型是一种通用模型,可以轻松查询和操作数据的各个部分,但有时为应用程序消费时对开发者造成挑战。
JSON 文档格式使开发者可以以分层形式轻松使用数据,但也增加了数据重复及相关的不一致性和可重用性挑战。
ORM 缓解了从面向对象的分层结构到关系表的分解和重建数据的任务,但可能会给整体架构带来自己的一系列挑战。
关系数据库和 JSON 文档模型的这些问题众所周知,许多数据库提供商一直在努力提供解决方案。Oracle 数据库中的一个新功能称为 JSON 关系对偶性(JSON Relational Duality),提供了一种前进的方法,它在单个数据库中结合了 JSON 文档和关系世界的优点,因此命名为 JSON 关系对偶性,同时避免了我目前讨论的权衡。
这个新功能可在 Oracle 数据库 23c 免费开发者版本中使用,任何人都可以下载和使用;律师永远不会敲门。如果您对该版本感兴趣,请查看我与 RedMonk 联合创始人 James Governor 的对话。 (这是 Oracle 在付费版本到来之前向开发者免费提供新数据库版本的前所未有的举动。但我离题了。)
让我们看看 JSON 关系对偶性能做什么:
通过允许一种称为 JSON 关系对偶视图的功能,数据仍以高效的规范化格式存储在关系表中,但应用程序以类似 JSON 文档的方式访问数据。这使开发者可以继续以 JSON 文档的方式访问数据,与此同时,系统在幕后使用高效和通用的关系模型进行数据存储。
这样,对偶视图从用户端隐藏了所有数据库级别的并发控制复杂性,提供了文档级的可序列化性。
可以使用直观的 GraphQL 或 SQL/JSON 语法在任意数量的表上声明对偶视图。例如,前面描述的示例可以定义为以下对偶视图,它将 students、schedules、courses 和 teachers 表中的关系数据呈现为与应用层 StudentSchedule 对象对应的 JSON 文档。
开发人员可以轻松地在相同的或重叠的关系表集上定义不同的对偶视图,以便于对同一数据支持许多用例(例如共享 courses 和 schedules 表的 TeacherSchedule 和 StudentSchedule 对偶视图)。
使用对偶视图,开发人员可以访问所有数据的 JSON 文档,包括访问存储在关系表中的数据。同时,如果愿意,他们仍然可以直接使用 SQL 访问关系数据。这样,使用对偶视图的应用程序现在可以简单地从数据库读取文档,进行任何所需的更改,然后将修改后的文档写回数据库,而无需担心底层的关系结构。
这里就是魔术所在:数据库将消耗 JSON 文档并根据 JSON 关系对偶视图定义在相应的行上正确执行创建、读取、更新和删除,具有完整的 ACID 并发和一致性控制、运行时优化,所有这些都在与数据库的单次往返和数据库优化操作中完成。最重要的是,开发者可以以他们习惯的方式操作由对偶视图实现的文档,使用他们通常的驱动程序、框架、工具和开发方法。
对偶视图还受益于一种新的无锁或乐观并发控制体系结构,因此开发者可以在无状态操作中一致地管理数据。您可以在此处找到更多详细信息,但基本思想是使用内置的乐观并发控制实现无状态的文档级可序列化性,避免悲观锁定及相关的性能问题,以便开发者可以继续专注于构建他们的应用程序,而不是调试并发控制机制和竞争条件。
为什么使用 JSON 关系对偶性:
- 对偶视图消除了对象关系映射(ORM)框架和 JSON 关系反/序列化器的需要。
- 面向文档的应用程序可以通过文档 API 访问对偶视图,例如 Oracle Database API for MongoDB 和 Oracle REST 数据服务(ORDS),或者它们可以使用标准的 SQL/JSON 函数。
- 对对偶视图的应用程序操作在数据库内部得到最佳执行,因为它们通过单个数据库往返和数据库优化操作获取和存储满足应用层对象用例的所有行。
- 对偶视图通过允许在相同或重叠的关系表上定义许多对偶视图,为每个应用程序提供其业务对象,而无需重复数据来消除数据重复。
- 对偶视图允许通过基于 JSON 文档的 PUT 和 POST 操作并发和一致地修改关系数据。
通过为开发人员提供 JSON 文档模型的灵活性和数据访问优势以及关系模型的存储效率和通用功能,JSON 关系对偶性是简化应用程序开发的一个重大进步。
很酷的是,任何人都可以通过下载 Oracle Database 23c 免费开发者版本免费试用这些功能。
此外,Oracle 还通过在 GitHub 上提供经过充分记录和易于学习的教程,使您更轻松地在构建应用程序时体验对偶视图。您可以浏览和下载教程,并在此版本中使用它们。在教程中,您可以使用SQL、REST 和 Oracle Database API for MongoDB 尝试与对偶视图相关的功能、功能和示例。最后但并非最不重要的是,Oracle 还提供了 LiveLabs,以帮助您在准备就绪的环境中玩转对偶视图。