首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于JSON的Oracle数据库应用程序开发(与MongoDB兼容)

基于JSON的Oracle数据库应用程序开发(与MongoDB兼容)

作者头像
Yunjie Ge
发布2023-09-01 14:47:36
发布2023-09-01 14:47:36
48800
代码可运行
举报
文章被收录于专栏:数据库与编程数据库与编程
运行总次数:0
代码可运行

本文档提供了Oracle数据库19c和21c版本以及相关Oracle技术中包含的特性和增强功能的概述。旨在帮助您了解为什么应用程序开发通常将JSON作为数据持久性格式,并且为什么Oracle数据库中的JSON功能完全适合解决开发人员的需求,这些开发人员寻求一个文档存储来持久保存、查询和处理应用程序数据。

灵活架构的应用程序开发

应用程序开发在一个不断变化的环境中进行。用户期望应用程序能够适应迅速变化的业务需求,并在应用程序演化时进行即时更新。所有这些意味着当应用程序发展时,开发人员需要具备最小停机时间或DBA参与的灵活数据持久性机制。关系模型缺乏这种灵活性:表具有静态的“形状”,应用程序更改需要修改表结构(例如添加新列),这通常涉及数据库管理员(DBA)。此外,现有数据可能需要进行修改以适应新的模式。更重要的是,关系方法需要事先设计模式:应用程序的对象(例如“客户订单”)被规范化为存储对象值的表和列。一个应用程序对象通常被规范化为多个表。这意味着现在简单的插入或获取操作需要插入并选择涉及所有参与表的操作,并具有正确的连接条件。开发人员必须理解此映射并使用SQL表达它。

尽管这种方法已经经过几十年的验证,但它通常被认为对于应用程序开发来说过于严格、正式和缓慢。此外,由于应用程序和数据库变更经常需要同步,因此存在停机时间增加和操作成本增加的风险。

文档存储(也称为文档数据库)以不同的方式工作,不需要事先定义模式。相反,应用程序数据被建模为文档,通常是JSON格式。每个文档都是自描述的(由命名的键/值对组成),因此不需要外部模式来理解这些值。此外,不同的文档可以具有不同的键/值对,使得通过在运行时添加新的键/值对而无需修改现有数据/文档,从而轻松地演化应用程序。因此,使用文档来持久保存数据为开发人员提供了灵活的存储机制。

另一个处理JSON的需求来自于基于JSON的API的普及性:REST服务使用JSON输入和输出。如果将这些JSON值映射到表中,如果第三方API发生更改并且不再与表匹配,应用程序可能会出现问题。相反,最好将JSON数据“原样”存储在支持对JSON数据进行查询的数据库中。

NoSQL文档存储的局限性

开发人员通常会倾向于使用NoSQL产品,因为它们被认为比关系数据库更易于使用。典型的NoSQL文档存储将JSON文档组织在集合中。由于数据模型简单,仅由集合和文档组成,因此这些系统提供的功能也很简单,尤其在报告或分析用例方面的功能有限。如果出现此类需求,开发人员通常会部署第二个(关系)数据库并将数据存储两次,通常需要进行ETL过程(抽取、转换、加载)以将数据转换为关系格式。此外,NoSQL文档存储通常不支持复杂事务和引用完整性约束,因此数据一致性现在成为开发人员的问题。所需的“解决方法”增加了系统的复杂性,降低了安全性,允许不一致性,并创建了新的问题,如跨不同数据库的时点恢复。由于增加的复杂性,总拥有成本往往很高,不再实现了简单NoSQL产品的承诺。

将Oracle数据库用作JSON文档存储

Oracle数据库提供了与专用的NoSQL文档存储相同的应用程序开发体验:它可以存储、管理和索引JSON文档,并且提供类似于常见NoSQL产品的NoSQL样式的文档存储API。它甚至支持与MongoDB兼容的API - 这是最受欢迎的文档存储之一。另外(与NoSQL产品不同),Oracle数据库还提供了对JSON文档进行复杂SQL查询、报告、分析和机器学习的功能。这使您可以将JSON和关系数据集成起来,在同一查询中进行连接。由于JSON功能集成到了Oracle数据库中,所有其企业级功能,如可用性、安全性、可扩展性、性能和可管理性,都得到了完全支持,适用于JSON数据。

在Oracle数据库中存储和管理JSON文档

Oracle数据库21c版本添加了一个新的SQL数据类型“JSON”,它使用优化的二进制格式进行快速查询和分段更新。早期版本(如19c)允许使用VARCHAR2、CLOB或BLOB列存储JSON文档。一个“IS JSON” SQL检查约束确保列只包含有效的JSON文档,允许数据库理解该列正在用作JSON文档的容器。

Oracle的JSON功能侧重于为灵活架构的开发和基于文档的存储提供全面支持。因此,尽管Oracle数据库知道给定列包含JSON文档,但这些文档是在没有数据库了解其内部结构(键/值对)的情况下存储、索引和查询的。开发人员可以根据需要自由更改JSON文档的结构。

Oracle数据库为其所有先进功能提供完整的JSON支持,包括灾难恢复、复制、压缩和加密。此外,支持Oracle数据库的产品,如Oracle Golden Gate和Oracle Data Integrator(以及第三方工具),无缝支持存储在数据库中的JSON文档。

自治JSON数据库

自从发布12.1.0.2版起,Oracle数据库就支持JSON,自那以后已经添加了许多JSON功能。名为“自治JSON数据库”(AJD)的托管数据库云服务提供了本技术报告中概述的功能,其价格明显低于自治数据库系列的其他成员。AJD除了支持文档存储API外,还完全能够运行任意的SQL并在关系表中存储非JSON数据。由于AJD面向JSON开发人员,非JSON数据存在20GB的限制;如果需要更多数据,则可以通过单击一次鼠标升级到自治事务处理(ATP)服务。因此,AJD不是一个需要不同技能或API的单独开发环境。

作为自治数据库平台的一部分,AJD用户可以充分受益于自治数据库的自动驾驶、自我保护和自我修复功能。最大限度地提高数据库的运行时间,并且自动缩放(最多可达到配置的CPU限制的三倍)提供了最佳性能和最低成本。

适用于自治数据库的Oracle数据库API for MongoDB

所有的Oracle自治数据库 - 包括自治JSON数据库 - 都与MongoDB兼容:为MongoDB编写的工具、驱动程序和应用程序可以使用MongoDB的本机API连接到Oracle自治数据库,该API将MongoDB数据库操作透明地转换为等效的SQL/JSON操作,然后在Oracle数据库上执行这些操作。如果MongoDB应用程序通过MongoDB API进行通信,就好像它们仍然连接到MongoDB服务器一样。开发人员可以继续使用他们的MongoDB技能和工具,同时还能够在MongoDB集合中运行SQL语句。这使得实时SQL分析和机器学习可以在JSON数据上进行。还可以从关系数据生成JSON,并将结果作为与MongoDB兼容的集合公开,以便轻松将查询结果或关系数据提供给MongoDB应用程序。

Oracle数据库的MongoDB API还支持MongoDB工具,如Compass、mongo shell和mongoimport/mongorestore,从而简化了迁移到Oracle的过程。截至今天(2022年2月),Oracle数据库的MongoDB API最初仅在共享的自治数据库上提供。

简单的Oracle文档访问API(SODA)

由于“Oracle数据库API for MongoDB”目前仅限于共享的自治数据库,因此Oracle提供了另一种通用可用的文档存储API:在云端(所有Oracle云数据库)以及本地:简单的Oracle文档访问(SODA)API。从头开始设计的这个API支持灵活的应用程序开发,并且与常见的No-Sql文档存储API非常相似,如MongoDB的API。

使用SODA,开发人员可以在不必学习SQL的情况下处理JSON文档和集合。相反,可以直接从简单的API中调用对集合和文档的数据库操作,该API适用于REST以及流行的编程语言Java、Python、JavaScript(Node.js)、C和PL/SQL。SODA for REST是Oracle Rest Data Services(ORDS)的一部分,可以从能够进行REST/HTTP调用的任何语言中调用。Java、Python、Node.js和C驱动程序是开源的。

SODA的概念模型与MongoDB非常相似:应用程序对象被存储为集合中的JSON文档。文档通过键进行标识,集合通过名称进行标识。异构集合允许存储非JSON对象,例如图像。多个集合驻留在一个客户端程序连接到的数据库中。

可以使用SODA命令访问文档,通常用于简单的CRUD操作(创建、读取+查找、更新、删除),但也可以使用SQL进行操作:可以轻松地在相同的JSON数据上执行报告、分析或机器学习。

SODA示例

以下Java代码创建了一个名为'orders'的集合,并插入一个JSON文档。然后,它检索由SODA分配给文档的唯一键(id)。SODA也可以接受用户生成的 id。

代码语言:javascript
代码运行次数:0
运行
复制
OracleRDBMSClient client = new OracleRDBMSClient();
OracleDatabase db = client.getDatabase(conn);
OracleCollection orders = db.admin().createCollection("orders");
OracleDocument doc = orders.insertAndGet(db.createDocument('{…}'));
String id = doc.getKey();
如您所见,数据库、集合和文档映射到具有公开其功能的函数的Java类。


在SODA for REST中,HTTP 响应(如PUT、POST、GET和DELETE)与对文档的SODA操作相匹配。URL包含文档的键或集合的名称,以及数据库主机名和授权凭证。SODA for REST是Oracle REST Data Service,并依赖于ORDS进行身份验证和授权。出于空间原因,示例中省略了这些内容。

这两个操作,即创建集合和插入文档,需要各自进行一次REST调用。第二个调用会生成一个带有分配的键(id)的HTTP响应:

代码语言:javascript
代码运行次数:0
运行
复制
curl -X PUT http://<authUrlToOrds>/soda/latest/orders
curl -X POST -H "Content-type: application/json"
--upload-file document.json http://<urlToORDS>/soda/latest/orders
{
"items": [
{
"id": "A450557094D04957B36346F630CDDF9A",
"etag":"C13578001CBBC84022DCF5F7209DBF0E6DFFCC626E3B0400C3",
"lastModified": "2021-02-09T01:03:48.291462",
"created": "2021-02-09T01:03:48.291462"
}
],
"hasMore": false, "count": 1
}

以上示例展示了文档存储与传统SQL数据库之间的区别:新文档以JSON对象的形式添加到集合中。数据库对这些文档中包含的键没有强加任何限制。而且,对于习惯于面向对象编程环境的开发人员来说,API调用更简单。

注意:SODA for REST与其他语言驱动程序(例如Java)之间的一个区别在于,REST是无状态的,因此所有REST操作都会立即提交,而语言驱动程序依赖于支持事务的数据库连接(多个操作可以作为原子操作进行)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NoSQL文档存储的局限性
  • 将Oracle数据库用作JSON文档存储
  • 在Oracle数据库中存储和管理JSON文档
  • 自治JSON数据库
  • 适用于自治数据库的Oracle数据库API for MongoDB
  • 简单的Oracle文档访问API(SODA)
  • SODA示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档