NDCS 的使用案例範例

航空公司行李追蹤應用程式和永久儲存使用者資料檔的串流媒體服務是 NoSQL Database Cloud Service 的兩個即時使用案例。

SQL for Oracle NoSQL Database 語言提供類似 SQL 的 Oracle NoSQL Database 介面。Oracle NoSQL Database 資料模型的 SQL 支援平面關聯式資料、階層式類型 (綱要完整) 資料,以及無綱要 JSON 資料。您可以針對需要固定資料或固定資料與無綱要 JSON 組合的應用程式,彈性地建立具有良好定義綱要的表格。Oracle NoSQL Database 支援許多最受歡迎的程式設計語言和架構,並具備 idiomatic language API 和資料結構,讓您的應用程式語言原生存取儲存在 NoSQL 資料庫中的資料。它目前支援下列程式設計語言和架構:Javascript (Node.js)、Python、Java、Golang、C#/.NET 和 Spring Data。您也可以在開發程式碼時,使用下列其中一種支援之整合開發環境的 Plugin 瀏覽資料庫: 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 輸入模式,瞭解使用 DDL 敘述句建立表格的步驟。

若要將資料載入 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 輸入模式,瞭解使用 DDL 敘述句建立表格的步驟。

若要將資料載入 OCI 主控台所建立的表格,請按一下表格名稱。便會顯示表格的詳細資訊。按一下上傳資料。按一下選取要上傳的檔案,然後提供要上傳的 JSON 檔案。您可以從此處下載適用於航空公司追蹤應用程式的 DDL 與 JSON 檔案。