NDCS의 샘플 사용 사례

항공사 수하물 추적 애플리케이션 및 사용자 프로필을 영구적으로 저장하는 스트리밍 미디어 서비스는 NoSQL Database Cloud Service의 두 가지 실시간 사용 사례입니다.

Oracle NoSQL Database용 SQL 언어는 Oracle NoSQL Database에 SQL과 유사한 인터페이스를 제공합니다. Oracle NoSQL Database용 SQL 데이터 모델은 플랫 관계형 데이터, 계층형 입력(스키마 전체) 데이터, 스키마리스 JSON 데이터를 지원합니다. 고정 데이터가 필요하거나 고정 데이터와 스키마리스 JSON의 조합이 필요한 애플리케이션에 대해 잘 정의된 스키마로 테이블을 유연하게 생성할 수 있습니다. Oracle NoSQL Database는 idiomatic 언어 API 및 데이터 구조를 사용하여 가장 많이 사용되는 프로그래밍 언어 및 프레임워크를 지원하므로 애플리케이션 언어가 NoSQL 데이터베이스에 저장된 데이터에 기본적으로 액세스할 수 있습니다. 현재 Javascript(Node.js), Python, Java, Golang, C#/.NET, Spring Data 프로그래밍 언어 및 프레임워크를 지원합니다. 지원되는 통합 개발 환경 Visual Studio Code,IntelliJ 또는 Eclipse 중 하나에 대한 플러그인을 사용하여 코드를 개발할 때 데이터베이스를 탐색할 수도 있습니다.

이 문서에는 다음 항목이 있습니다.

예제에 사용된 샘플 사용 사례

다양한 SQL 개념을 배우기 위한 두 가지 스키마(실시간 시나리오 포함)가 있습니다. 이 두 스키마에는 Oracle NoSQL 데이터베이스에서 사용할 수 있는 다양한 데이터 유형이 포함됩니다.

스키마 1: BaggageInfo 스키마

이 스키마를 사용하면 항공편을 여행하는 승객이 최종 목적지로 가는 경로를 따라 체크인된 가방이나 수하물의 진행 상황을 추적할 수 있는 사용 사례를 처리할 수 있습니다. 이 기능은 항공사의 모바일 애플리케이션의 일부로 제공될 수 있습니다. 승객이 모바일 애플리케이션에 로그인하면 현재 항공편의 티켓 번호 또는 예약 코드가 화면에 표시됩니다. 승객은 이 정보를 사용하여 수하물 정보를 검색할 수 있습니다. 모바일 애플리케이션은 NoSQL 데이터베이스를 사용하여 수하물과 관련된 모든 데이터를 저장합니다. 백엔드에서 모바일 애플리케이션 논리는 SQL 질의를 수행하여 필요한 데이터를 검색합니다.

스키마 2: 스트리밍 매체 서비스 - 영구 사용자 프로파일 저장소

TV 스트리밍 응용 프로그램을 고려하십시오. 전 세계 고객이 시청하는 다양한 쇼를 스트리밍합니다. 모든 쇼에는 여러 시즌이 있으며 각 시즌에는 여러 에피소드가 있습니다. TV 스트리밍 애플리케이션을 사용하여 고객의 현재 활동을 추적하는 영구 메타데이터 저장소가 필요합니다. 이 스키마를 사용하면 본 에피소드, 에피소드당 시계 시간, 본 쇼의 총 시즌 수 등과 같은 유용한 정보를 고객에게 제공할 수 있습니다. 데이터는 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 - 영구 사용자 프로파일 저장소

이 스키마에 사용된 테이블은 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          |          |
 +----+----------+------+----------+---------+----------+------------+----------+

query를 실행할 샘플 데이터

예제에 사용된 테이블을 생성하고 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 파일은 여기에서 다운로드할 수 있습니다.