第一章 文档数据库 (DocDB) 简介

数据平台 DocDB 是用于存储和检索数据库数据的工具。它与传统 SQL 表和字段(类和属性)数据存储和检索兼容但又分开。它基于 JSONJavaScript 对象表示法),为基于 Web 的数据交换提供支持。 IRIS 支持在 RESTObjectScript 中开发 DocDB 数据库和应用程序,并为创建或查询 DocDB 数据提供 SQL 支持。

从本质上来说, 文档数据库是一种无模式数据结构。这意味着每个文档都有自己的结构,可能与同一数据库中的其他文档不同。与需要预定义数据结构的 SQL 相比,这有几个好处。

“文档”一词在这里用作特定的行业范围内的技术术语,作为动态数据存储结构。 DocDB 中使用的“文档”不应与文本文档或文档混淆。

特点和优点

DocDB 的一些主要功能包括:

  • 应用程序灵活性:文档不需要预定义的模式。这使得应用程序能够快速设置其数据环境并轻松适应数据结构的变化。这允许快速捕获数据。文档数据库可以立即开始捕获数据,而无需为该数据定义结构。这对于不可预测的数据源来说是理想的选择,正如基于网络和社交媒体数据源中常见的那样。如果在捕获数据体时,该数据中的结构变得明显或变得有用,那么文档数据结构就会演变。现有捕获的数据可以与这种更加结构化的数据表示共存。由应用程序确定每个文档的数据结构并对其进行适当的处理。实现此目的的一种方法是建立表示文档结构版本的键:值对。因此,数据从一种 JSON 结构到另一种 JSON 结构的转换可以逐步执行,而不会中断数据捕获或访问,或者根本无法完成数据转换。
  • 稀疏数据效率:文档在存储稀疏数据方面非常高效,因为具有特定键的属性可以出现在集合中的某些文档中,但不能出现在其他文档中。一个文档可能有一组定义的键;同一集合中的另一个文档可能具有一组非常不同的已定义键。相比之下,SQL 要求每条记录都包含每个键;在稀疏数据中,许多记录的键具有 NULL 值。例如,SQL 患者病历提供了许多诊断、病情和测试的字段;对于大多数患者来说,这些字段中的大部分都是 NULL。系统为所有这些未使用的字段分配空间。在 DocDB 患者医疗记录中,仅存在包含实际数据的那些键。
  • 分层数据存储:DocDB 在存储分层结构数据方面非常有效。在键:值对中,数据可以无限数量地嵌套在数据中。这意味着分层数据可以非标准化地存储。在SQL关系模型中,分层数据通过使用多个表标准化存储。
  • 动态数据类型:键没有定义的数据类型。分配给键的值具有关联的数据类型。因此,一个文档中的键:值对可能有一种数据类型;另一个文档中相同键的键:值对可能具有不同的数据类型。由于数据类型不固定,因此您可以在运行时通过分配具有不同数据类型的新值来更改文档中键:值对的数据类型。

DocDB 的这些功能对于应用程序开发具有重要意义。在传统的 SQL 环境中,数据库设计建立了开发应用程序时遵循的数据结构。在 DocDB 中,数据结构主要由应用程序本身提供。

DocDB 的组件

DocDB 的包名称是 %DocDB。它包含以下类:

  • %DocDB.Database:用于管理文档的 ObjectScript 持久类。数据库是一组文档,由扩展的持久类实现

%DocDB.Document。可以使用此类的方法来创建数据库、检索现有数据库或删除数据库,以及在数据库内插入文档、检索文档或删除文档。

  • %DocDB.Document:用于存储文档数据的结构。它由文档 ID、最后修改日期和文档内容组成。文档内容存储在 %Doc 属性中。数据存储为 JSON 动态对象或 JSON 动态数组。文档由多个键:值对(对象)或值的有序列表(数组)组成。
  • %DocDB.RESTDocDB REST API 来访问文档数据库。

相关类是 %Library.DynamicAbstractObject,用于包含 JSON 结构,并包含 JSON 数组和 JSON key:value 对象的子类。

创建数据库

数据库是一个 ObjectScript 持久类,它扩展了抽象类 %DocDB.Document。必须为用于 DocDB 的每个命名空间实例化一个数据库。每个命名空间只需要一个数据库。通常,它被分配与命名空间名称相同的名称。

以下示例展示了如何通过类定义创建数据库:

Class MyDBs.People Extends %DocDB.Document [ DdlAllowed ]

以下示例演示如何使用 %CreateDatabase()方法创建数据库,并指定包名称:

  SET personDB = ##class(%DocDB.Database).%CreateDatabase("MyDBs.People")

以下示例显示如何使用 %CreateDatabase()方法创建数据库,并采用 ISC.DM 默认包名称:

  SET personDB = ##class(%DocDB.Database).%CreateDatabase("People")

类中的 %SYSTEM.DocDB 提供了用于管理文档数据库的界面。

02-14 13:15