NDCSのサンプル・ユースケース

航空会社の手荷物追跡アプリケーションと、ユーザー・プロファイルを永続的に格納するストリーミング・メディア・サービスは、NoSQL Database Cloud Serviceの2つのリアルタイム・ユース・ケースです。

Oracle NoSQL Database用のSQLは、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データのプログラミング言語とフレームワークがサポートされています。また、次のサポートされている統合開発環境のプラグイン(Visual Studio CodeIntelliJまたはEclipse)のいずれかを使用してコードを開発する際に、データベースをナビゲートすることもできます。

この記事には次のトピックが含まれます:

例で使用されているサンプルのユースケース

様々なSQLの概念を学習するために、2つの異なるスキーマ(およびリアルタイム・シナリオ)を使用します。これら2つのスキーマには、Oracle NoSQLデータベースで使用できる様々なデータ型が含まれます。

スキーマ1: BaggageInfoスキーマ

このスキーマを使用すると、フライトで旅行する乗客が、最終目的地までのルートに沿って、チェックインされた荷物またはチェックインされた荷物の進行を追跡できるユースケースを処理できます。この機能は、航空会社のモバイル・アプリケーションの一部として利用できます。乗客がモバイル・アプリケーションにログインすると、現在のフライトのチケット番号または予約コードが表示されます。乗客は、この情報を使用して手荷物情報を検索できます。モバイル・アプリケーションでは、NoSQLデータベースを使用して、荷物に関連するすべてのデータを格納しています。バックエンドでは、モバイル・アプリケーション・ロジックにより、SQL問合せを実行して必要なデータを取得します。

スキーマ2: ストリーミング・メディア・サービス- 永続ユーザー・プロファイル・ストア

TVストリーミング・アプリケーションについて検討します。世界中の顧客が視聴する様々な番組をストリーミングしています。すべての番組にはいくつかのシーズンがあり、各シーズンには複数のエピソードがあります。TVストリーミング・アプリケーションを使用して顧客の現在のアクティビティをトラッキングする永続メタデータ・ストアが必要です。このスキーマを使用すると、顧客が視聴したエピソード、エピソードごとの視聴時間、視聴した番組の合計シーズン数などの有用な情報を顧客に提供できます。データはNoSQLデータベースに格納され、アプリケーションはSQL問合せを実行して必要なデータを取得し、ユーザーが使用できるようにします。

例で使用する表

表は、ユーザー・データを保持するための基本構造です。

表1: 航空手荷物追跡アプリケーション

このスキーマで使用される表はBaggageInfoです。このスキーマには、LONG、STRINGなどの固定データ型の組合せが存在します。また、列の1つとしてスキーマなしの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: 航空会社荷物の追跡アプリケーション:荷物アプリケーションの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文を使用して表を作成するステップは、「シングルトン表の作成: 拡張DDL入力モード」を参照してください。

OCIコンソールから作成された表にデータをロードするには、表名をクリックします。表の詳細が表示されます。「データをアップロード」をクリックします。「アップロードするファイルの選択」をクリックし、アップロードするJSONファイルを指定します。航空会社追跡アプリケーションのDDLおよびJSONファイルは、ここからダウンロードできます。

表2: Streaming Media Service - 永続ユーザー・プロファイル・ストアストリーミング・メディア・アプリケーションの1つのサンプル行を次に示します。
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文を使用して表を作成するステップは、「シングルトン表の作成: 拡張DDL入力モード」を参照してください。

OCIコンソールから作成された表にデータをロードするには、表名をクリックします。表の詳細が表示されます。「データをアップロード」をクリックします。「アップロードするファイルの選択」をクリックし、アップロードするJSONファイルを指定します。航空会社追跡アプリケーションのDDLおよびJSONファイルは、ここからダウンロードできます。