NDCS 的範例使用案例
航空公司行李追蹤應用程式和持續儲存使用者設定檔的串流媒體服務是 NoSQL Database Cloud Service 的兩個即時使用案例。
Oracle NoSQL Database 語言的 SQL 提供類似 SQL 的 Oracle NoSQL Database 介面。Oracle NoSQL Database 資料模型的 SQL 支援扁平式關聯式資料、階層式 (綱要完整) 資料,以及無綱要 JSON 資料。您可以彈性為需要固定資料或固定資料與無綱要 JSON 的組合的應用程式,建立具有定義完善綱要的表格。Oracle NoSQL Database 支援許多最受歡迎的程式設計語言和架構,搭配慣用語言 API 和資料結構,讓您的應用程式語言原生存取儲存在 NoSQL 資料庫中的資料。它目前支援下列程式設計語言和架構:Javascript (Node.js)、Python、Java、Golang、C#/.NET 和 Spring Data。當您使用下列其中一個支援的整合開發環境的外掛程式開發程式碼時,也可以瀏覽資料庫: Visual Studio Code 或 IntelliJ 。
本文包含下列主題:
範例中使用的範例使用案例
您有兩個不同的綱要 (具有即時案例),可用來學習各種 SQL 概念。這兩個綱要將包括可用於 Oracle NoSQL 資料庫的各種資料類型。
綱要 1:BuggageInfo 綱要
使用這個架構,您可以處理一個使用案例,讓搭乘航班的乘客可以追蹤登機行李或行李在航線至最終目的地的進度。此功能可作為航空公司行動應用程式的一部分來使用。當乘客登入流動應用程式後,畫面上會顯示目前航班的機票號碼或預訂代碼。旅客可利用此資訊搜尋行李資料。行動應用程式使用 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 檔案。