NDCS 的示例用例

航空公司行李跟踪应用程序和用于持久存储用户资料的流媒体服务是 NoSQL Database Cloud Service 的两个实时用例。

SQL for Oracle NoSQL Database 语言提供与 Oracle NoSQL Database 类似的 SQL 接口。SQL for Oracle NoSQL Database 数据模型支持平面关系数据、分层类型 (schema-full) 数据和无模式 JSON 数据。您可以灵活地为需要固定数据或固定数据和无模式 JSON 组合的应用创建具有明确定义的模式的表。Oracle NoSQL Database 支持许多流行的编程语言和框架,具有惯用语言 API 和数据结构,可让您的应用语言原生访问 NoSQL 数据库中存储的数据。它目前支持以下编程语言和框架:Javascript(Node.js),Python,Java,Golang,C#/.NET 和 Spring Data。您还可以在使用以下受支持的集成开发环境之一的插件开发代码时导航数据库: Visual Studio CodeIntelliJ

本文包含以下主题:

示例中使用的用例

有两个不同的方案(包含实时方案)用于学习各种 SQL 概念。这两个方案将包括可在 Oracle NoSQL 数据库中使用的各种数据类型。

方案 1:BaggageInfo 方案

使用此模式,您可以处理一个用例,在该用例中,乘坐飞机的乘客可以跟踪其登机行李或行李沿途到达最终目的地的进度。此功能可作为航空公司移动应用程序的一部分提供。乘客登录移动应用程序后,当前航班的机票号码或预订代码将显示在屏幕上。乘客可以使用这些信息来搜索他们的行李信息。该移动应用程序正在使用 NoSQL 数据库存储与行李相关的所有数据。在后端中,移动应用程序逻辑会执行 SQL 查询来检索所需的数据。

方案 2:流媒体服务 - 持久用户概要文件存储

考虑一个电视流应用程序。它播放了全球各地客户观看的各种节目。每个节目都有多个季节,每个季节都有多个剧集。您需要一个持久性的元数据存储来跟踪使用电视流应用程序的客户当前的活动。使用此方案,您可以向客户提供有用的信息,例如他们观看的节目,每集的观看时间,他们观看的节目的总季节数等。数据存储在 NoSQL 数据库中,应用程序执行 SQL 查询以检索所需的数据并使其可供用户使用。

示例中使用的表

表是用于存储用户数据的基本结构。

表 1:航空公司行李追踪应用

此方案中使用的表为 BaggageInfo。此方案具有固定数据类型的组合,如 LONG、STRING。它还具有无模式 JSON (bagInfo) 作为其列之一。无模式 JSON 没有固定数据类型。乘客的包信息是一个无模式的 JSON。相比之下,乘客的信息,如车票号码,全名,性别,联系方式都是固定模式的一部分。您可以向此非固定无模式 JSON 字段添加任意数量的字段。

以下代码将创建表。

CREATE TABLE BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)

表 2:Streaming Media Service - Persistent user profile store

此方案中使用的表为 stream_acct。此方案中的主键为 acct_id。方案还包括一个 JSON 列 (acct_data),该列无方案。无模式 JSON 没有固定数据类型。您可以向此非固定无模式 JSON 字段添加任意数量的字段。

以下代码将创建表。

CREATE TABLE stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

描述表格

可以使用 DESCRIBE 或 DESC 命令查看表的描述。

(DESCRIBE | DESC) [AS JSON] TABLE table_name [ "(" field_name")"]

如果希望输出为 JSON 格式,则可以指定 AS JSON。您可以通过提供字段名称来获取有关任何表中的特定字段的信息。

示例 1:描述表

DESCRIBE TABLE stream_acct

输出:

=== Information ===
+-------------+-----+-------+----------------+----------+--------+----------+---------+---------+-------------+
|    name     | ttl | owner | jsonCollection | sysTable | parent | children | regions | indexes | description |
+-------------+-----+-------+----------------+----------+--------+----------+---------+---------+-------------+
| stream_acct |     |       | N              | N        |        |          |         |         |             |
+-------------+-----+-------+----------------+----------+--------+----------+---------+---------+-------------+

=== Fields ===
+----+----------------+--------------+----------+---------+----------+------------+----------+
| id |      name      |     type     | nullable | default | shardKey | primaryKey | identity |
+----+----------------+--------------+----------+---------+----------+------------+----------+
|  1 | acct_id        | Integer      | N        | NULL    | Y        | Y          |          |
+----+----------------+--------------+----------+---------+----------+------------+----------+
|  2 | profile_name   | String       | Y        | NULL    |          |            |          |
+----+----------------+--------------+----------+---------+----------+------------+----------+
|  3 | account_expiry | Timestamp(9) | Y        | NULL    |          |            |          |
+----+----------------+--------------+----------+---------+----------+------------+----------+
|  4 | acct_data      | Json         | Y        | NULL    |          |            |          |
+----+----------------+--------------+----------+---------+----------+------------+----------+
                                                                                                                                                          ---+----------+

示例 2:描述表并将输出显示为 JSON

DESC AS JSON TABLE BaggageInfo

输出:

{
  "json_version" : 1,
  "type" : "table",
  "name" : "BaggageInfo",
  "fields" : [{
    "name" : "ticketNo",
    "type" : "LONG",
    "nullable" : false
  }, {
    "name" : "fullName",
    "type" : "STRING",
    "nullable" : true
  }, {
    "name" : "gender",
    "type" : "STRING",
    "nullable" : true
  }, {
    "name" : "contactPhone",
    "type" : "STRING",
    "nullable" : true
  }, {
    "name" : "confNo",
    "type" : "STRING",
    "nullable" : true
  }, {
    "name" : "bagInfo",
    "type" : "JSON",
    "nullable" : true
  }],
  "primaryKey" : ["ticketNo"],
  "shardKey" : ["ticketNo"]
}

示例 3:描述表的一个特定字段

DESCRIBE TABLE BaggageInfo (ticketNo)

输出:

+----+----------+------+----------+---------+----------+------------+----------+
| id |   name   | type | nullable | default | shardKey | primaryKey | identity |
+----+----------+------+----------+---------+----------+------------+----------+
|  1 | ticketNo | Long | N        | NULL    | Y        | Y          |          |
+----+----------+------+----------+---------+----------+------------+----------+

用于运行查询的示例数据

您可以使用 OCI 控制台创建示例中使用的表,并将数据加载到表中。

表 1:航空公司行李跟踪应用:下面显示了行李应用的一个示例行。

"ticketNo" : 1762344493810,
"fullName" : "Adam Phillips",
"gender" : "M",
"contactPhone" : "893-324-1064",
"confNo" : "LE6J4Z",
 [ {
    "id" : "79039899165297",
    "tagNum" : "17657806255240",
    "routing" : "MIA/LAX/MEL",
    "lastActionCode" : "OFFLOAD",
    "lastActionDesc" : "OFFLOAD",
    "lastSeenStation" : "MEL",
    "flightLegs" : [ {
      "flightNo" : "BM604",
      "flightDate" : "2019-02-01T01:00:00",
      "fltRouteSrc" : "MIA",
      "fltRouteDest" : "LAX",
      "estimatedArrival" : "2019-02-01T03:00:00",
      "actions" : [ {
        "actionAt" : "MIA",
        "actionCode" : "ONLOAD to LAX",
        "actionTime" : "2019-02-01T01:13:00"
      }, {
        "actionAt" : "MIA",
        "actionCode" : "BagTag Scan at MIA",
        "actionTime" : "2019-02-01T00:47:00"
      }, {
        "actionAt" : "MIA",
        "actionCode" : "Checkin at MIA",
        "actionTime" : "2019-02-01T23:38:00"
      } ]
    }, {
      "flightNo" : "BM667",
      "flightDate" : "2019-01-31T22:13:00",
      "fltRouteSrc" : "LAX",
      "fltRouteDest" : "MEL",
      "estimatedArrival" : "2019-02-02T03:15:00",
      "actions" : [ {
        "actionAt" : "MEL",
        "actionCode" : "Offload to Carousel at MEL",
        "actionTime" : "2019-02-02T03:15:00"
      }, {
        "actionAt" : "LAX",
        "actionCode" : "ONLOAD to MEL",
        "actionTime" : "2019-02-01T07:35:00"
      }, {
        "actionAt" : "LAX",
        "actionCode" : "OFFLOAD from LAX",
        "actionTime" : "2019-02-01T07:18:00"
      } ]
    } ],
    "lastSeenTimeGmt" : "2019-02-02T03:13:00",
    "bagArrivalDate" : "2019.02.02T03:13:00"
  } ]

在 OCI 控制台中,使用 Advanced DDL Input Mode(高级 DDL 输入模式)创建表。

CREATE TABLE IF NOT EXISTS BaggageInfo (
ticketNo LONG,
fullName STRING,
gender STRING,
contactPhone STRING,
confNo STRING,
bagInfo JSON,
PRIMARY KEY (ticketNo)
)

有关使用 DDL 语句创建表的步骤,请参见 Creating Singleton Table:Advanced DDL Input Mode

要将数据加载到从 OCI 控制台创建的表中,请单击表名。此时将显示表的详细信息。单击上载数据。单击选择要上载的文件并提供要上载的 JSON 文件。您可以在此处下载适用于航空公司跟踪应用程序的 DDL 和 JSON 文件。

表 2:流媒体服务 - 持久性用户配置文件存储下面显示了流媒体应用程序的一个样例行。

1,
123456789,
"AP",
"2023-10-18",
{
   "firstName": "Adam",
   "lastName": "Phillips",
   "country" : "Germany",
   "contentStreamed": [
      {
         "showName" : "At the Ranch",
         "showId" : 26,
         "showtype" : "tvseries",
         "genres" : ["action", "crime", "spanish"],
         "numSeasons" : 4,
         "seriesInfo": [
            {
               "seasonNum" : 1,
               "numEpisodes" : 2,
               "episodes": [
                  {
                     "episodeID": 20,
		 	"episodeName" : "Season 1 episode 1",
                     "lengthMin": 85,
                     "minWatched": 85,
                     "date" : "2022-04-18"
                  },
                  {
                     "episodeID": 30,
                     "lengthMin": 60,
		 	"episodeName" : "Season 1 episode 2",
                     "minWatched": 60,
                     "date" : "2022-04-18"
                  }
               ]
            },
            {
               "seasonNum": 2,
               "numEpisodes" : 2,
               "episodes": [
                  {
                     "episodeID": 40,
		        "episodeName" : "Season 2 episode 1",
                     "lengthMin": 50,
                     "minWatched": 50,
                     "date" : "2022-04-25"
                  },
                  {
                     "episodeID": 50,
		 	"episodeName" : "Season 2 episode 2",
                     "lengthMin": 45,
                     "minWatched": 30,
                     "date" : "2022-04-27"
                   }
                ]
             }
          ]
       },
       {
          "seasonNum": 3,
          "numEpisodes" : 2,
          "episodes": [
             {
                "episodeID": 60,
	  	"episodeName" : "Season 3 episode 1",
                "lengthMin": 50,
                "minWatched": 50,
                "date" : "2022-04-25"
             },
             {
                 "episodeID": 70,
		   "episodeName" : "Season 3 episode 2",
                 "lengthMin": 45,
                 "minWatched": 30,
                 "date" : "2022-04-27"
              }
            ]
          }
        ]
      },
      {
        "showName": "Bienvenu",
        "showId": 15,
        "showtype": "tvseries",
        "genres" : ["comedy", "french"],
        "numSeasons" : 2,
        "seriesInfo": [
           {
             "seasonNum" : 1,
             "numEpisodes" : 2,
             "episodes": [
                {
                    "episodeID": 20,
		      "episodeName" : "Bonjour",
                   "lengthMin": 45,
                   "minWatched": 45,
                   "date" : "2022-03-07"
                },
                {
                   "episodeID": 30,
		      "episodeName" : "Merci",
                   "lengthMin": 42,
                   "minWatched": 42,
                   "date" : "2022-03-08"
                }
             ]
          }
       ]
    }
  ]
}

在 OCI 控制台中,使用 Advanced DDL Input Mode(高级 DDL 输入模式)创建表。

CREATE TABLE IF NOT EXISTS stream_acct(
acct_id INTEGER,
profile_name STRING,
account_expiry TIMESTAMP(9),
acct_data JSON,
PRIMARY KEY(acct_id)
)

有关使用 DDL 语句创建表的步骤,请参见 Creating Singleton Table:Advanced DDL Input Mode

要将数据加载到从 OCI 控制台创建的表中,请单击表名。此时将显示表的详细信息。单击上载数据。单击选择要上载的文件并提供要上载的 JSON 文件。您可以在此处下载适用于航空公司跟踪应用程序的 DDL 和 JSON 文件。