TechNight#71 Oracle Database 23c 新機能#1 JSON関連新機能
Oracle Database 23cJSON関連新機能Oracle Database Technology Night #71Kaoru Yamakawa⽇本オラクル株式会社クラウド・エンジニアリング統括Autonomous & Analytics ソリューション部2023/9/28
View Slide
The following is intended to outline our general product direction.It is intended for information purposes only, and may not beincorporated into any contract. It is not a commitment to deliverany material, code, or functionality, and should not be reliedupon in making purchasing decisions. The development, release,timing, and pricing of any features or functionality described forOracle’s products may change and remains at the sole discretionof Oracle Corporation.2 Copyright © 2023, Oracle and/or its affiliates
Copyright © 2023, Oracle and/or its affiliates3JSON Relational Duality
リレーショナル・モデルCopyright © 2023, Oracle and/or its affiliates4強⼒宣⾔的なSQLを使⽤し、基礎となる正規化されたデータを組み合わせて、必要なアプリケーションを作成可能課題アプリケーション・オブジェクトを基本的なデータベースのデータにマップするには、スキルと労⼒が必要リレーショナル表表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …データベース
アプリケーションはデータをプログラミング⾔語およびユースケース固有のオブジェクトとして利⽤課題: アプリケーション・オブジェクトとリレーショナルのミスマッチ複雑なアプリケーション・オブジェクト親タイプ変数、参照メソッド⼦タイプC変数、参照メソッド⼦タイプB変数、参照メソッド⼦タイプA変数、参照メソッド継承継承継承アプリケーションCopyright © 2023, Oracle and/or its affiliates5
アプリケーション・オブジェクトを正規化されたリレーショナル・データに変換するにはスキルと労⼒が必要課題: アプリケーション・オブジェクトとリレーショナルのミスマッチ複雑なアプリケーション・オブジェクト親タイプ変数、参照メソッド⼦タイプC変数、参照メソッド⼦タイプB変数、参照メソッド⼦タイプA変数、参照メソッド継承継承継承アプリケーション正規化されたリレーショナル表表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …データベースCopyright © 2023, Oracle and/or its affiliates6
従来の⼿法は特定のユース・ケース⽤に最適化され、リレーショナルの柔軟性が⽋如このミスマッチを解消するための様々な試みCopyright © 2023, Oracle and/or its affiliates7オブジェクトデータベースドキュメントデータベースリレーショナル表ではなくJSONとしてデータを格納⾔語オブジェクトを表にマップするためのコードを⽣成データベースへのユーザー定義の型および継承の追加データを表ではなくオブジェクト形式でネイティブに格納オブジェクト・リレーショナルマッピングツール(ORM)表Col1 Col2 Col3… … …… … …オブジェクト・リレーショナルデータベース表Col1 Col2 Col3… … …… … …ORMはアプリケーション・オブジェクトからリレーショナルへの変換をしやすくするレイヤーを追加するが、ミスマッチを根本的に解決するものではない
Copyright © 2023, Oracle and/or its affiliatesJSON RelationalDualityOracle Database 23cINTRODUCING
アプリケーション開発の例- 学⽣の受講スケジュール学⽣の受講スケジュールを作成するアプリケーションを開発すると想定 STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102Copyright © 2023, Oracle and/or its affiliates9
アプリケーションに必要なデータは、リレーショナル・スキーマ内の正規化された表に格納アプリケーション開発の例- 学⽣の受講スケジュールSTUDENTSTUID SNAME SINFOS3245 Jill …S8524 John …S1735 Jane …S3409 Jim …TEACHERTEACHID TNAME TINFOT123 Anika …T543 Adam …T789 Anita …T612 Alex …COURSECID CNAME ROOM TIME TEACHIDC123 MA_01 A102 14:00 T543C345 SCI_02 B405 16:00 T789C567 HIS_02 A102 14:00 T612C789 LA_01 A256 12:00 T543STUDENT COURSESSCID STUID CID1 S3245 C1232 S8524 C5673 S3245 C3454 S3409 C123Copyright © 2023, Oracle and/or its affiliates10
アプリケーションに必要なデータは、リレーショナル・スキーマ内の正規化された表に格納アプリケーション開発の例- 学⽣の受講スケジュールCopyright © 2023, Oracle and/or its affiliates11STUDENTSTUDENT_COURSES COURSETEACHERstuid(PK)stuid(FK)cid(PK)cid(FK)teachid(PK)teachid(FK)
正規化された表を使⽤したアプリケーションの開発は⾮常に柔軟だが、開発者にとっては必ずしも容易ではないアプリケーション開発の例- 学⽣の受講スケジュールJillのスケジュールを作成するには、開発者は4つの表それぞれに対してデータベース操作を実⾏する必要があるSTUDENTTEACHERCOURSESTUDENT COURSESSQLSQLSQLSQLSTUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102Copyright © 2023, Oracle and/or its affiliates12
リレーショナル・データと開発者データベース開発者にとっては、単⼀のデータベース操作でJillのスケジュールを作成できることが理想的STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102Copyright © 2023, Oracle and/or its affiliates13
JSONはそのシンプルさから、データ・アクセスおよびデータ交換形式として広く利⽤されているJSONドキュメントあらゆるデータに対応JSONドキュメントは、複雑な⾔語オブジェクトを名前と値のペアの単純な階層として表現することが可能送受信が簡単⾃⼰記述型、⾃⼰完結型のフォーマットは、変更に柔軟に適応し、システム間での送受信が容易{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}Copyright © 2023, Oracle and/or its affiliates14
JSONは標準として広く利⽤されているWeb Apps REST 開発ツールJavaScriptCopyright © 2023, Oracle and/or its affiliates15
Jillの受講スケジュールはJSONでシンプルに表現可能{"student" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : "Science 102","room" : "B405","teacher" : "Anita"}]}STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102Copyright © 2023, Oracle and/or its affiliates16
Jillの受講スケジュールはJSONでシンプルに表現可能Jillが受講する各コースのデータは、JillのJSONドキュメントに埋め込まれる{"student" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : "Science 102","room" : "B405","teacher" : "Anita"}]}STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102Copyright © 2023, Oracle and/or its affiliates17
ドキュメント・データベースはJSONの操作を簡単にするドキュメント・データベースは、JSONドキュメントへのアクセス、JSONドキュメントの格納が容易単純なGET/PUT APIの使⽤{"student" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : "Science 102","room" : "B405","teacher" : "Anita"}]}DatabasePUTGETCopyright © 2023, Oracle and/or its affiliates18
Oracle Databaseは優れたドキュメント・データベースOracleは、純粋なドキュメント・データベースより優れたドキュメント機能を提供1998年からXMLドキュメントをサポート2014年からJSONドキュメントをサポートすべてのリリースで継続的に機能を強化{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}Copyright © 2023, Oracle and/or its affiliates19
Oracle DatabaseにおけるJSON関連機能の主な進化• 12c Release 1JSONのサポートを開始(CLOB/BLOB/VARCHAR2列へのJSONの格納)• 12c Release 2JSONデータ・ガイドのサポート(JSONデータからビューや仮想列を作成)JSONデータ⽣成のためのSQL/JSONファンクションを実装(JSON_OBJECT、JSON_ARRAY等)• 18cJSONデータの格納および問合せ⽤の複数のSQL拡張機能を実装• 19c(2019年)JSON_SERIALIZE(バイナリJSONデータのテキスト化、出⼒フォーマットの指定)をサポート• 21cJSONデータ型(ネイティブ・バイナリ形式)をサポートOracle Database API for MongoDBをサポート(ORDS 22.3以降)• 23cJSON Relational DualityのサポートOracle Databaseは優れたドキュメント・データベースCopyright © 2023, Oracle and/or its affiliates20
Oracle Databaseは優れたドキュメント・データベースドキュメントAPIまたはSQL APIを使⽤して、ドキュメントを簡単に格納、取得、分析および操作が可能• OracleはドキュメントのためのSQL拡張機能をオープンSQL標準に定期的に提供CREATE TABLE student_schedule(student_id number,schedule_doc JSON);SELECT schedule_docFROM student_schedule sWHERE s.schedule_doc.student = 'Jill';Copyright © 2023, Oracle and/or its affiliates21
SODA : Simple Oracle Document AccessOracleのドキュメント対応はドキュメント・データベースよりも優れているドキュメント・データベースより優れている完全なドキュメントAPI-SODA-Oracle Database APIfor MongoDB1ドキュメント間での完全なACID⼀貫性ドキュメントに対する分析、空間、グラフ、ML、並列処理2 3標準ベースのSQLによるドキュメントへのアクセスを提供JavaScript、JavaまたはPL/SQLで記述されたストアド・プロシージャドキュメント・データベースより優れているCopyright © 2023, Oracle and/or its affiliates22
アプリケーションにMongoDB互換のインターフェースを提供(MongoDB Shell、pymongo等)利⽤⼿順1. ORDSのzipファイルのダウンロード(バージョン22.3以降)https://www.oracle.com/database/sqldeveloper/technologies/db-actions/download/2. ORDSのインストールと構成ords install3. Oracle Database API for MongoDBの有効化ords config set mongo.enabled true4. ORDSの起動ords serve5. スキーマに対してORDSを有効化SQL > exec ORDS.ENABLE_SCHEMA;6. MongoDBクライアントからコマンドを実⾏student_schedule.find({"name":"Jill"})Oracle Database API for MongoDBCopyright © 2023, Oracle and/or its affiliates23ORDS : Oracle REST Data Servicesマニュアル︓Oracle REST Data Service Installation and Configuration GuideOracle API for MongoDB Supportサポートされるクライアントサポートされるバージョンmongosh 0.15.6MongoDB Tools 100.5.2Java 4.3.0Python 3.12.0Node.js 4.1.0C# 2.13.0Go 1.6.0
ドキュメント・データベースの制限STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102STUDENT SCHEDULE FOR JACKTime 4:00 PMRoom B405Teacher AnitaTime 6:00 PMRoom A115Teacher AlexPhysicsScience 102JSONドキュメントは、アプリケーションがデータのアクセス形式として使⽤するのが簡単データのストレージ形式として使⽤すると、データの重複とデータの⼀貫性に関する問題が発⽣Copyright © 2023, Oracle and/or its affiliates24
ドキュメント・データベースの制限STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102STUDENT SCHEDULE FOR JACKTime 4:00 PMRoom B405Teacher AnitaTime 6:00 PMRoom A115Teacher AlexPhysicsScience 102JSONを使⽤して学⽣の受講スケジュールを保存すると、コースおよび教師の情報が各学⽣のスケジュールに重複して格納される重複データ• ⾮効率なデータの保存• データの更新コストが増⼤• データの⼀貫性を保つことが困難Copyright © 2023, Oracle and/or its affiliates25
ドキュメント・データベースの制限{"student" : "S3245","name" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : ”Science 102","room" : ”B105","teacher" : "Anita}]}{"student" : "S4356","name" : "Jack","schedule " :[{"time" : "16:00","course" : "Science 102","room" : ”B105","teacher" : "Anita}{"time" : "14:00","course" : ”Physics","room" : ”B405","teacher" : "Anita}]}STUDENT SCHEDULE FOR: JILL STUDENT SCHEDULE FOR: JACKJSONを使⽤して学⽣の受講スケジュールを保存すると、コースおよび教師の情報が各学⽣のスケジュールに重複して格納される重複データ• ⾮効率なデータの保存• データの更新コストが増⼤• データの⼀貫性を保つことが困難Copyright © 2023, Oracle and/or its affiliates26
複数のユースケースで同じデータを利⽤する場合アプリケーションは時間の経過と共に必然的にユースケースが増えていく新しいユース・ケースで同じデータが使⽤されると、データの重複が増加するたとえば、教師の講義スケジュールのユース・ケースを追加する場合STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102TEACHER SCHEDULE FOR ANITATime 2:00 PM Room A312Time 4:00 PM Room B405Time 6:00 PM Room A151Science 102Copyright © 2023, Oracle and/or its affiliates27
複数のユースケースで同じデータを利⽤する場合教師の講義スケジュールのユース・ケースには、教師をルートとする新しいドキュメント形式が必要• ただし、学⽣のドキュメントと同じコース・データを共有STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102TEACHER SCHEDULE FOR ANITATime 2:00 PM Room A312Time 4:00 PM Room B405Time 6:00 PM Room A151Science 102Copyright © 2023, Oracle and/or its affiliates28
複数のユースケースで同じデータを利⽤する場合{"student" : "S3245","name" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : "Science 102","room" : "B105","teacher" : "Anita}]}{"teacher" : "T9351","name" : "Anita","schedule " :[{"time" : "14:00","course" : "Science 102","room" : "A312"},{"time" : "16:00","course" : "Science 102","room" : "B105"},{"time" : "18:00","course" : "Science 102","room" : "A115"}]}STUDENT SCHEDULE FOR: JILL TEACHER SCHEDULE FOR: ANITA教師の講義スケジュールのユース・ケースには、教師をルートとする新しいドキュメント形式が必要• ただし、学⽣のドキュメントと同じコース・データを共有Copyright © 2023, Oracle and/or its affiliates29
複数のユースケースで同じデータを利⽤する場合{"student" : "S3245","name" : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","room" : "A102","teacher" : "Adam"},{"time" : "16:00","course" : "Science 102","room" : "B105","teacher" : "Anita}]}{"teacher" : "T9351","name" : "Anita","schedule " :[{"time" : "14:00","course" : "Science 102","room" : "A312"},{"time" : "16:00","course" : "Science 102","room" : "B105"},{"time" : "18:00","course" : "Science 102","room" : "A115"}]}STUDENT SCHEDULE FOR: JILL TEACHER SCHEDULE FOR: ANITAデータが重複して格納されるため、コースの教室を変更するには、多数の学⽣の受講スケジュールのドキュメントを⼀度に更新する必要がある教師の講義スケジュールのドキュメントも同時に更新する必要があるCopyright © 2023, Oracle and/or its affiliates30
プラスあらゆるユース・ケースで両⽅のメリットを享受することは可能かリレーショナル• ユースケースの柔軟性• 問合せ可能性• ⼀貫性• ストレージ効率ドキュメント• ⾔語の型への簡単なマッピング• 俊敏なスキーマレス開発• 階層データ形式• 標準データ交換フォーマットJSON PLUS RelationalBenefitsUse Case ComplexityJSONRelationalCopyright © 2023, Oracle and/or its affiliates31
JSON Relational DualityデータにJSONドキュメントとしてアクセスし、ドキュメント・アプリケーションのシンプルさを実現リレーショナル・モデルおよびSQLアクセスの利点を提供するために、データを表に⾏として格納ストレージ形式表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …アクセス書式{"label1" : "String Anita","label2" : 5678"label3" : "Physics 201",}{"label1" : "Student Jill","label2" : 5678"label3" : "Science 102",}{"name1" : "String Value1","name2" :{"name3" : "14:00""name4" : 1234}}Copyright © 2023, Oracle and/or its affiliates32
JSON Relational Dualityはリレーショナル・モデルとドキュメント・モデルの両⽅の利点を兼ね備えるJSON Relational DualityCopyright © 2023, Oracle and/or its affiliates33柔軟性の⾼いデータの利⽤正規化による効率的なデータの変更正規化による効率的なデータの保存開発が容易⾔語の型へのマッピングが容易データの保存と取出しが容易
JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義GraphQL構⽂を使⽤してstudent_scheduleDualityビューを宣⾔する⽅法の例ビューの構造が必要なJSONオブジェクトの構造を反映CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses{scid: scidcourse: course{timecourse: cnamecourse_id: cidroomteacher: teacher{teacher: tnameteacher_id: teachid}}}};{….[ {….},{..}]}STUDENT SCHEDULE : JILLCopyright © 2023, Oracle and/or its affiliates34
CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses{scid: scidcourse: course{timecourse: cnamecourse_id: cidroomteacher: teacher{teacher: tnameteacher_id: teachid}}}};JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義JSONドキュメントを構成するデータを含む表を指定TEACHERCOURSESTUDENTSTUDENT COURSECopyright © 2023, Oracle and/or its affiliates35
CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses{scid: scidcourse: course{timecourse: cnamecourse_id: cidroomteacher: teacher{teacher: tnameteacher_id: teachid}}}};JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義各JSONプロパティの名前およびその値を取得するための表の列名を指定STUDENTSTUID SNAME SINFOS3245 Jill …S8524 John …S1735 Jane …S3409 Jim …Copyright © 2023, Oracle and/or its affiliates36
CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses @delete @insert @update{scid: scidcourse: course{timecourse: cnamecourse_id: cidroomteacher: teacher{teacher: tnameteacher_id: teachid}}}};JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義更新可能性ルールの指定(Dualityビュー student_schedule経由でstudent_coursesを更新可能、student、course、teacherは更新不可)Copyright © 2023, Oracle and/or its affiliates37
JSON Relational Duality ビューの更新可能性制御• デフォルトではDuality ViewはRead Only• アノテーション(@︓GraphQL、WITH︓SQL)で更新(変更)可否を制御• INSERT/NOINSERT(表レベルで指定可能)• DELETE/NODELETE(表レベルで指定可能)• UPDATE/NOUPDATE(表レベルおよび列レベルで指定可能、列レベルの指定が優先)• Duality Viewのルート表のINSERT/DELETEが指定されている場合、ドキュメントのINSERT/DELETEが可能• Duality Viewの定義の中(表または列の)でUPDATEが指定されている場合は、ドキュメントのUPDATEが可能JSON Relational Dualityの定義Copyright © 2023, Oracle and/or its affiliates38
JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔更新不可のプロパティを更新しようとした場合︓ERROR at line 1:ORA-40937: Cannot insert into table 'TEACHER' in JSON Relational Duality View'STUDENT_SCHEDULE': Missing INSERT annotation or NOINSERT annotation specified.Help: https://docs.oracle.com/error-help/db/ora-40937/ERROR at line 1:ORA-40940: Cannot update field 'teacher' corresponding to column 'TNAME' oftable 'TEACHER' in JSON Relational Duality View 'STUDENT_SCHEDULE': MissingUPDATE annotation or NOUPDATE annotation specified.Help: https://docs.oracle.com/error-help/db/ora-40940/JSON Relational Dualityの定義Copyright © 2023, Oracle and/or its affiliates39
CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses @delete @insert @update{scid: scidcourse @unnest{timecourse: cnamecourse_id: cidroomteacher @unnest{teacher: tnameteacher_id: teachid}}}};JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義ネストされたオブジェクトのプロパティを親プロパティ内でネストしない場合に指定Copyright © 2023, Oracle and/or its affiliates40
JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔@unnest 指定なし @unnest 指定ありJSON Relational Dualityの定義Copyright © 2023, Oracle and/or its affiliates41"schedule" :[{"scid" : 1,"course" :{"time" : "14:00","course" : "MA_01","course_id" : "C123","room" : "A102","teacher" :{"teacher" : "Adam","teacher_id" : "T543"}}}]"schedule" :[{"scid" : 1,"time" : "14:00","course" : "MA_01","course_id" : "C123","room" : "A102","teacher" : "Adam","teacher_id" : "T543"}]
JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔JSON Relational Dualityの定義Copyright © 2023, Oracle and/or its affiliates42CREATE OR REPLACE JSON DUALITY VIEW student_schedule ASSELECT JSON { 'name': s.sname,'student_id': s.stuid,'schedule':[ (SELECT JSON { 'scid': sc.scid,UNNEST(SELECT JSON { 'time': c.time,'course': c.cname,'course_id':c.cid,'room':c.room,UNNEST(SELECT JSON { 'teacher':t.tname,'teacher_id':t.teachid }FROM teacher tWHERE c.teachid = t.teachid )}FROM course cWHERE c.cid = sc.cid )}FROM student_courses sc WITH INSERT UPDATE DELETEWHERE s.stuid = sc.stuid )]}FROM student s;SQL構⽂を使⽤してstudent_scheduleDualityビューを宣⾔する⽅法の例
Dualityビューの使⽤学⽣のスケジュールのDualityビューを検索すると、ベースとなる表にアクセスし、JillのスケジュールをJSONドキュメントとして返す• このドキュメントにはユースケースに必要なすべてのデータが含まれています• データの更新に必要なID{"student_id" : "S3245","name : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","course_id" : "C123","room" : "A102","teacher" : "Adam","teacher_id" : "T543",},{"time" : 16:00、"course" : "Science 102","course_id" : "C345","room" : "B405","teacher" : "Anita","teacher_id" : "T789",}]}STUDENT SCHEDULE FOR: JILLCopyright © 2023, Oracle and/or its affiliates43
TipsDualityビューのベースとなる表• 適切なPRIMARY KEY、UNIQUE KEY、FOREIGN KEYが設定されている必要がある• 検索パフォーマンス向上のためFOREIGN KEYが設定されている列にはインデックスを作成するDualityビューで使⽤可能な列の型• VARCHAR2• NVARCHAR2• CHAR• NCHAR• NUMBER• BINARY_DOUBLE• BINARY_FLOAT• BOOLEAN• JSONDualityビューの使⽤Copyright © 2023, Oracle and/or its affiliates44• DATE• TIMESTAMP• TIMESTAMP WITH TIME ZONE• INTERVAL YEAR TO MONTH• INTERVAL DAY TO SECOND• BLOB• CLOB• NCLOB• RAW
Dualityビューの使⽤例SQLまたはドキュメントAPIを使⽤してDualityビューにアクセス可能SELECT dataFROM student_schedule sWHERE s.data.name = 'Jill';student_schedule.find({"name":"Jill"}){"student_id" : "S3245","name : "Jill","schedule " :[{"time" : "14:00","course" : "Math 101","course_id" : "C123","room" : "A102","teacher" : "Adam","teacher_id" : "T543",},{"time" : 16:00、"course" : "Science 102","course_id" : "C345","room" : "B405","teacher" : "Anita","teacher_id" : "T789",}]}STUDENT SCHEDULE FOR: JILLCopyright © 2023, Oracle and/or its affiliates45<SQL>︓JSON型のdata列にアクセス<ドキュメントAPI>︓ビューと同名のコレクションとしてアクセス
Dualityビューの構造• Dualityビューは単⼀のJSON型の列(data)のみを持つDualityビューの使⽤例Copyright © 2023, Oracle and/or its affiliates46SQL> desc student_scheduleName Null? Type-------------------------- -------- ---------------DATA JSONSELECT dataFROM student_schedule sWHERE s.data.name = 'Jill';
Dualityビューに対する検索Dualityビューの使⽤例Copyright © 2023, Oracle and/or its affiliates47SQL> SELECT JSON_SERIALIZE(data PRETTY) json_data2 FROM student_schedule s3 WHERE s.data.name = 'Jill';JSON_DATA---------------------------------------------------------------{"_metadata" :{"etag" : "D341258911E06C5956538288BAC4CD91","asof" : "00000000002A5096"},"name" : "Jill","student_id" : "S3245","schedule" :[{"scid" : 1,"time" : "14:00","course" : "MA_01","course_id" : "C123","room" : "A102","teacher" : "Adam","teacher_id" : "T543"},…
Dualityビューは、RESTを使⽤して⾮常に簡単にアクセス可能• Dualityビューからのドキュメントの取得(GET)• GETしたドキュメントに必要な変更を加える• Dualityビューへのドキュメントの書き戻し(PUT)データベースは、新しいドキュメントの変更を⾃動的に検出し、ビューのベースとなる表の⾏を変更• 同じデータを共有するすべてのDualityビューに変更が即時に反映される• 開発者は不整合を⼼配する必要がない⾮常にシンプルデータベースアプリGET DocPUT DocChange DocGET school.edu/student_schedule?q={"student":"Jill"}Copyright © 2023, Oracle and/or its affiliates48
RESTではなくAPIを使⽤するアプリケーションは、以下のAPIを利⽤可能• Simple Oracle Document Access API(SODA)• Oracle MongoDB互換API(Oracle Database API for MongoDB)⾮常にシンプルデータベースアプリPUT DocCopyright © 2023, Oracle and/or its affiliates49GET DocChange Doc
開発者はドキュメント中⼼のアプリを簡単に構築可能• 新しいドキュメントをリレーショナル・データとして格納• 既存のリレーショナル・データをドキュメントとして操作• リレーショナル・データベースの上にJSONベースのマイクロサービスを構築さらに、Oracleのコンバージド・データベースのすべてのメリットを享受可能きわめて⾼い柔軟性データベースDocumentCentric AppCopyright © 2023, Oracle and/or its affiliates50
シンプルなアプリケーション・オブジェクトの永続性TEACHER OBJECTTeacher Name: AnitaDepartment: ScienceSupervisor: AmyCourses: Science 102,Math 203JSON PUTDuality Viewアプリケーション・オブジェクトを永続化するためには• 開発者は⾔語固有のオブジェクト表現をJSONに変換するだけ• あとはデータベースがJSON Duality ビューを使⽤して、⾃動的にJSONを表に永続化JSONへの変換は、REST、JavaScriptなどのコーディング時に使⽤されることが多いため、開発者にとっては使いやすく簡単Copyright © 2023, Oracle and/or its affiliates51
アプリケーション・オブジェクトのDualityビューによるメリットデータベース内でアプリケーション・オブジェクトの永続性形式を宣⾔すると、多くの利点がある• オブジェクトとリレーショナルのミスマッチをブリッジ• ドキュメントAPIを使⽤することでアプリケーションがオブジェクトを操作しやすくなる• アプリケーション・オブジェクトの永続性フォーマットの⼀元化• クライアントの⾔語またはフレームワークに依存しないTEACHER OBJECTTeacher Name: AnitaDepartment: ScienceSupervisor: AmyCourses: Science 102,Math 203JSON PUTDuality ViewCopyright © 2023, Oracle and/or its affiliates52
Duality Viewアプリケーション・オブジェクトのDualityビューによるメリットシンプルさと標準化によるメリットだけではなく、データベースの持つ豊富な機能をアプリケーション・オブジェクトに対しても実装可能に• 分析• ETL(抽出、変換、ロード)• レプリケーション• テキスト索引• トリガー• 検証• セキュリティ・ルール• ビジネス・ルールTEACHER OBJECTTeacher Name: AnitaDepartment: ScienceSupervisor: AmyCourses: Science 102,Math 203JSON PUTCopyright © 2023, Oracle and/or its affiliates53
透過的なスキーマの変更Dualityビューによって提供される抽象化により、透過的なアプリケーション・オブジェクトの展開が可能• アプリケーションで使⽤している表スキーマに対する変更をビューを更新することでアプリケーションから隠蔽• 新しいアプリケーションに必要なJSONフォーマットへの変更は新しいビューを作成することで既存のアプリケーションから隠蔽DBの変更を隠蔽アプリの変更を隠蔽TEACHER OBJECTTeacher Name: AnitaDepartment: ScienceSupervisor: AmyCourses: Science 102,Math 203Duality ViewCopyright © 2023, Oracle and/or its affiliates54
画期的なロックフリー同時実⾏性制御REST GETおよびPUT APIを使⽤している場合、従来のロックは機能しない• GETおよびPUTはステートレスAPI• トランザクションとロックは、ステートレス・コール間で保持できないJSON Relational Dualityは、ドキュメント操作のために新しい⾰新的なロックフリーの同時実⾏性制御プロトコルを実装Copyright © 2023, Oracle and/or its affiliates55
画期的なロックフリー同時実⾏性制御楽観的同時実効性制御と呼ばれるChange DocGET DocPUT Doc格納データが変更された場合に拒否データベースアプリドキュメントのベースとなるデータが、最初のドキュメントの読取り(GET)と後続の書込み(PUT)の間に変更された場合、データベースが⾃動的に検出• 変更が発⽣した場合、書込み操作は⾃動的に拒否され、エラーが返される• その後、アプリケーションは変更されたデータに基づいて、書込みを再実⾏可能Copyright © 2023, Oracle and/or its affiliates56
ロックフリー同時実⾏性制御の利点1. ⼈間が考えている間はデータがロックされないため、対話型アプリケーションに最適2. 古いドキュメントによる書込みが拒否されるため、切断される可能性のあるモバイルアプリケーションに最適3. 失効しているキャッシュされたドキュメントの書込みが拒否されるため、ドキュメント・キャッシュに最適Copyright © 2023, Oracle and/or its affiliates57
ETAGを使⽤ロックフリー同時実⾏性制御- 仕組みGet DocETAGデータベースアプリHTTPプロトコルでは、ETAGはWebページの内容の署名またはフィンガープリントOracleは、ロックフリーの同時実⾏性制御を実装するために、HTTP ETAGをコア・データベースに独⾃に拡張• データベースはETAGを⾃動的に計算し、戻されるドキュメント⾃体に挿⼊• ETAGはドキュメントのベースとなる列の値から算出されるハッシュ値• ドキュメントのベースとなる列の値から算出されるハッシュ値Copyright © 2023, Oracle and/or its affiliates58
ロックフリー同時実⾏性制御- 仕組みCopyright © 2023, Oracle and/or its affiliates59SQL> SELECT json_serialize(data PRETTY)2 FROM student_schedule s3 WHERE s.data.name = 'Jill';JSON_SERIALIZE(DATAPRETTY)-----------------------------------------------{"_metadata" :{"etag" : "D341258911E06C5956538288BAC4CD91","asof" : "000000000026E1FC"},"name" : "Jill","student_id" : "S3245","schedule" :[← ETAG︓ドキュメントのベースとなる列の値から算出されるハッシュ値…
ロックフリー同時実⾏性制御- 仕組みPUT Doc変更されたドキュメントがPUTでデータベースに書き戻される時• データベースは、ドキュメントのベースとなる⾏のデータがGETによって取得したETAGの値と⼀致していることを検証• ⾏のETAGの値が⼀致する場合、⾏は⾃動的に更新される• ⼀致しない場合は別のユーザーによってデータが変更されているため、PUT操作は拒否される• 新しいデータを使⽤してPUTを再試⾏するChange DocETAGデータベースアプリRejectif ETAGof DataChangedCopyright © 2023, Oracle and/or its affiliates60ERROR at line 1:ORA-42699: Cannot update JSON Relational Duality View 'STUDENT_SCHEDULE':The ETAG of document with ID 'FB04533332343500' in the database did not match the ETAG passed in.Help: https://docs.oracle.com/error-help/db/ora-42699/ETAGが⼀致しない(データが変更されている)場合︓
ETAGによる同時実⾏性制御は値ベース更新の競合はETAGを使⽤してデータの値⾃体を検証することで検出ロックやバージョンをデータに追加する形ではない値ベースの同時実⾏性制御Put DocETAGChange DocデータベースアプリCopyright © 2023, Oracle and/or its affiliates61
値ベースであるため、ETAGは多くの異なるドキュメントで共有されるデータへの更新を⾃動的に同期• 例︓コース・データが多くの学⽣のドキュメントで共有されている• 例︓教師や学⽣のドキュメントのように、異なるドキュメント・ルートを持つドキュメントによって共有される場合このような場合、従来のロックまたはバージョンベースの同時実⾏性制御はうまく機能しない値ベースは同じデータを使⽤した異なるビューでも機能STUDENT SCHEDULE FOR JILLTime 4:00 PMRoom B405Teacher AnitaTime 2:00 PMRoom A102Teacher AdamMath 101 Science 102TEACHER SCHEDULE FOR ANITATime 2:00 PM Room A312Time 4:00 PM Room B405Time 6:00 PM Room A151Science 102Copyright © 2023, Oracle and/or its affiliates62
@nocheckにより特定のプロパティをETAGの計算対象から除外値ベースにより重要でない変更を無視することが可能ETAGの計算対象からroomを除外すると、コースの場所が変更されていた場合に発⽣するDualityビューに対するPUTの失敗を回避可能CREATE OR REPLACE JSON DUALITY VIEW FROM student_schedule ASstudent{name: snamestudent_id: stuidschedule: student_courses @delete @insert @update{course: course{timecourse: cnamecourse_id: cidroom @nocheckteacher: teacher{teacher: tnameteacher_id: tid}} } };ETAGの計算対象から、更新によってPUTが拒否されるべきでないデータを除外することが可能• デフォルトではドキュメント内の全てのフィールドがETAGの計算対象• @nocheckを指定したプロパティはETAGの計算から除外• 表レベル、列レベル(プロパティレベル)で指定可能• 列レベルの指定が優先される• 以下のような場合には、すべてのプロパティを除外可能- アプリケーションで同時実⾏性制御を実施している- アプリケーションがシングルスレッドで同時更新が起きないCopyright © 2023, Oracle and/or its affiliates63
データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能データ・スキーマが既知の場合に最適表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …Copyright © 2023, Oracle and/or its affiliates64
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセスSQLAPICopyright © 2023, Oracle and/or its affiliates65
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセスSQLAPIドキュメントAPICopyright © 2023, Oracle and/or its affiliates66
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセス開発者はデータをドキュメントとして格納可能SQLAPIドキュメントAPIスキーマが動的または開発中のコレクションまたは表の列に最適Copyright © 2023, Oracle and/or its affiliates67
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセス開発者はデータをドキュメントとして格納可能• JSONデータ・ガイドを使⽤してJSONデータに対してリレーショナル・ビューを作成し、リレーショナルとしてアクセスSQLAPIドキュメントAPICopyright © 2023, Oracle and/or its affiliates68
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセス開発者はデータをドキュメントとして格納可能• JSONデータ・ガイドを使⽤してJSONデータに対してリレーショナル・ビューを作成し、リレーショナルとしてアクセス• ANSI JSON拡張を使⽤してSQLから、またはSODAやMongoDB APIからドキュメントとしてアクセスSQLAPIドキュメントAPICopyright © 2023, Oracle and/or its affiliates69
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}動的JSONストレージを使⽤して開発を開始し、スキーマの⼀部が安定している場合またはスキーマの⼀部が安定したタイミングで、リレーショナルに移⾏可能データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセス開発者はデータをドキュメントとして格納可能• JSONデータ・ガイドを使⽤してJSONデータに対してリレーショナル・ビューを作成し、リレーショナルとしてアクセス• ANSI JSON拡張を使⽤してSQLから、またはSODAやMongoDB APIからドキュメントとしてアクセスSQLAPIドキュメントAPICopyright © 2023, Oracle and/or its affiliates70
表1 2 3… … …… … …… … …… … …表1 2 3… … …… … …… … …… … …表列1 列2 列3… … …… … …… … …… … …{"name1" : "String Value1","name2" :{"name3" : "14:00","name4" : 1234}}データベース内ドキュメントのすべてのユースケース開発者はデータをリレーショナルとして格納可能• 標準のSQLを使⽤したリレーショナルとしてのアクセス• Dualityビューを使⽤したドキュメントとしてのアクセス開発者はデータをドキュメントとして格納可能• JSONデータ・ガイドを使⽤してJSONデータに対してリレーショナル・ビューを作成し、リレーショナルとしてアクセス• ANSI JSON拡張を使⽤してSQLから、またはSODAやMongoDB APIからドキュメントとしてアクセス各ユースケースに応じて、最適なストレージ形式とアクセス形式を選択可能• データベースの制限による不適切なストレージ形式またはアクセス形式を強制されないCopyright © 2023, Oracle and/or its affiliates71
JSON Relational Dualityのメリット72 Copyright © 2023, Oracle and/or its affiliatesアプリケーション・オブジェクトを簡単にJSONとして永続化および操作し、オブジェクトとリレーショナルのミスマッチをブリッジ可能Dualityビューを使⽤するとデータをドキュメントまたは表として透過的に読み書き可能値ベースの同時実⾏性制御によりドキュメントと表の間で⼀貫性を確保ステートレスAPI、対話型ユース・ケース、モバイル切断クライアントを実現
JSON Relational Dualityのメリットドキュメント開発者73 Copyright © 2023, Oracle and/or its affiliatesJSON Relational DualityはJSONの開発のシンプルさとリレーショナルのユースケースの拡張性を提供既存のリレーショナル・データを使⽤してドキュメントベースのアプリケーションを簡単に構築し、Oracleのコンバージド・データベースのすべての⾼度な機能を利⽤可能データ重複や⼀貫性の問題を発⽣させることなくドキュメント・スキーマを各ユースケースに最適化
JSON Relational Dualityのメリットリレーショナル開発者74 Copyright © 2023, Oracle and/or its affiliatesドキュメント指向のアプリケーションで作成されたデータを使⽤したSQLベースのアプリケーション作成やデータ分析が可能JSON Relational DualityはORMよりも効率的で、より⼀元化され、かつ⼀貫性が⾼い1回の呼出しおよび1回のラウンド・トリップでアプリケーションのユースケースに必要なすべての⾏に簡単にアクセス可能ORM: Object Relational Mapping
JSON Relational Dualityのメリットデータベース管理者、インフラ管理者75 Copyright © 2023, Oracle and/or its affiliatesデータが⼀元化されるため、必要なストレージコストが削減データベースが⼀元化されるため管理・運⽤⼯数が削減データが⼀元化されるため、データの移動やデータ連携が不要
DBの運⽤、DBストレージ、DBデータ、アプリケーション、ツールが全て別々、データ連携にはETLが必要Before JSON Ralational DualityCopyright © 2023, Oracle and/or its affiliates76Query APIREST API{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}SQLInterfaceRelational(Table)JSON(Document) App based onDocument DBApp based onRelational DBfind()SELECTINSERTUPDATEDELETEOracle Database ドキュメントDBinsertOne()updateOne()deleteOne()insertMany()updateMany()deleteMany()ETL
DBの運⽤、DBストレージ、DBデータは⼀つに集約、ETL不要、アプリケーション、ツールは⽤途によって使い分けAfter JSON Ralational DualityCopyright © 2023, Oracle and/or its affiliates77REST APISODAOracleDatabaseAPI forMongoDB{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}{name1 : value1,name2 :{name3 : 100,name4 : 14:00}}SQLInterfaceRelational(Table)JSON(Duality View) App based onDocument DBApp based onRelational DBJSON Relational DualitySELECTINSERTUPDATEDELETEOraclefind()insertOne()updateOne()deleteOne()insertMany()updateMany()deleteMany()
• マニュアルJSON-Relational Duality Developer's Guide• チュートリアルJSON Relational Duality tutorials• LiveLabsAutoREST with JSON Relational Duality Views in 23c Free• BlogJSONとリレーショナルの⼆⾯性: ドキュメント、オブジェクトおよびリレーショナル・モデルの⾰新的な統合• JSON Relational Dualityビューの制限事項Oracle Database 23c リリース・ノート︓JSON Relational Dualityビューの制限JSON Relational Duality 参考情報Copyright © 2023, Oracle and/or its affiliates78
JSON Relational Dualityビュー関連のディクショナリ・ビュー• DBA_JSON_DUALITY_VIEWS、USER_JSON_DUALITY_VIEWS、ALL_JSON_DUALITY_VIEWS• Dualityビューの情報• DBA_JSON_DUALITY_VIEW_TABS、USER_JSON_DUALITY_VIEW_TABS、ALL_JSON_DUALITY_VIEW_TABS• Dualityビューから参照されている表の情報• DBA_JSON_DUALITY_VIEW_TAB_COLS、USER_JSON_DUALITY_VIEW_TAB_COLS、ALL_JSON_DUALITY_VIEW_TAB_COLS• Dualityビューから参照されている表の列の情報• DBA_JSON_DUALITY_VIEW_LINKS、USER_JSON_DUALITY_VIEW_LINKS、ALL_JSON_DUALITY_VIEW_LINKS• Dualityビューにおけるテーブル間のリンクに関する情報JSON Relational Duality 参考情報Copyright © 2023, Oracle and/or its affiliates79
Copyright © 2023, Oracle and/or its affiliates80その他のJSON関連の新機能
JSONスキーマ• RFCドラフトのJSONスキーマ標準に準拠• 許可されるプロパティと対応する許可されるデータ型、およびそれらがオプションか必須かを指定するJSONドキュメント• JSONスキーマを使⽤してJSONドキュメントの構造と型情報を検証JSONスキーマを使⽤した制約の事前検証• DBMS_JSON_SCHEMA.DESCRIBE• データベースにデータを送る前に、JSONスキーマを使⽤してアプリケーション側でデータの事前検証が可能にJSONテキストとして格納されたデータをJSON型に移⾏するためのツール• PL/SQLプロシージャDBMS_JSON.JSON_TYPE_CONVERTIBLE_CHECK• JSONテキストとして格納された既存のデータをJSONデータ型に移⾏できるかどうかをチェック可能その他のJSON関連の新機能Copyright © 2023, Oracle and/or its affiliates81
JSON_VALUE、JSON_QUERYのJSONパス式で述語をサポート• JSON_VALUE、JSON_QUERYで述語を含むJSONパス式が使⽤可能にJSON_SERIALIZEでORDERED句をサポート• 要素名をアルファベット順に並べ替えるオプションのキーワードORDEREDが使⽤可能に問合せによるJSON_ARRAYコンストラクタ• JSON_ARRAYの引数として副問合せを使⽤して配列要素を定義可能にJSON_TRANSFORMの機能拡張• 右辺でのパス式、ネストされたパスおよび算術演算の利⽤、配列内の要素をソートできるSORT演算⼦をサポート外部表でのJSON型のサポート• 外部表を定義する際の列の型としてJSON型が指定可能にその他のJSON関連の新機能Copyright © 2023, Oracle and/or its affiliates82