NDCS 的示例用例

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

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

本文章包含以下主题:

示例中使用的示例用例

有两个不同的方案(包含实时方案)用于学习各种 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:流媒体服务 - 持久性用户配置文件存储

此方案中使用的表为 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 控制台中,使用高级 DDL 输入模式使用下面给定的 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 控制台中,使用高级 DDL 输入模式使用下面给定的 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 文件。