第一章 文档数据库 (DocDB) 简介
数据平台 DocDB
是用于存储和检索数据库数据的工具。它与传统 SQL
表和字段(类和属性)数据存储和检索兼容但又分开。它基于 JSON
(JavaScript
对象表示法),为基于 Web
的数据交换提供支持。 IRIS
支持在 REST
和 ObjectScript
中开发 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.REST
:DocDB 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
提供了用于管理文档数据库的界面。