$30 off During Our Annual Pro Sale. View Details »

TechNight#71 - Oracle Database 23c 新機能#1 JSON関連新機能

TechNight#71 - Oracle Database 23c 新機能#1 JSON関連新機能

TechNight#71 Oracle Database 23c 新機能#1 JSON関連新機能

oracle4engineer
PRO

September 28, 2023
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Oracle Database 23c
    JSON関連新機能
    Oracle Database Technology Night #71
    Kaoru Yamakawa
    ⽇本オラクル株式会社
    クラウド・エンジニアリング統括
    Autonomous & Analytics ソリューション部
    2023/9/28

    View Slide

  2. The following is intended to outline our general product direction.
    It is intended for information purposes only, and may not be
    incorporated into any contract. It is not a commitment to deliver
    any material, code, or functionality, and should not be relied
    upon in making purchasing decisions. The development, release,
    timing, and pricing of any features or functionality described for
    Oracle’s products may change and remains at the sole discretion
    of Oracle Corporation.
    2 Copyright © 2023, Oracle and/or its affiliates

    View Slide

  3. Copyright © 2023, Oracle and/or its affiliates
    3
    JSON Relational Duality

    View Slide

  4. リレーショナル・モデル
    Copyright © 2023, Oracle and/or its affiliates
    4
    強⼒
    宣⾔的なSQLを使⽤し、基礎となる
    正規化されたデータを組み合わせて、
    必要なアプリケーションを作成可能
    課題
    アプリケーション・オブジェクトを
    基本的なデータベースのデータに
    マップするには、スキルと労⼒が必要
    リレーショナル表

    1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    データベース

    View Slide

  5. アプリケーションはデータをプログラミング⾔語およびユースケース固有のオブジェクトとして利⽤
    課題: アプリケーション・オブジェクトとリレーショナルのミスマッチ
    複雑なアプリケーション・オブジェクト
    親タイプ
    変数、参照
    メソッド
    ⼦タイプC
    変数、参照
    メソッド
    ⼦タイプB
    変数、参照
    メソッド
    ⼦タイプA
    変数、参照
    メソッド
    継承
    継承
    継承
    アプリケーション
    Copyright © 2023, Oracle and/or its affiliates
    5

    View Slide

  6. アプリケーション・オブジェクトを正規化されたリレーショナル・データに変換するにはスキルと労⼒が必要
    課題: アプリケーション・オブジェクトとリレーショナルのミスマッチ
    複雑なアプリケーション・オブジェクト
    親タイプ
    変数、参照
    メソッド
    ⼦タイプC
    変数、参照
    メソッド
    ⼦タイプB
    変数、参照
    メソッド
    ⼦タイプA
    変数、参照
    メソッド
    継承
    継承
    継承
    アプリケーション
    正規化されたリレーショナル表

    1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    データベース
    Copyright © 2023, Oracle and/or its affiliates
    6

    View Slide

  7. 従来の⼿法は特定のユース・ケース⽤に最適化され、リレーショナルの柔軟性が⽋如
    このミスマッチを解消するための様々な試み
    Copyright © 2023, Oracle and/or its affiliates
    7
    オブジェクト
    データベース
    ドキュメント
    データベース
    リレーショナル表ではなく
    JSONとしてデータを格納
    ⾔語オブジェクトを
    表にマップするための
    コードを⽣成
    データベースへの
    ユーザー定義の型
    および継承の追加
    データを表ではなく
    オブジェクト形式で
    ネイティブに格納
    オブジェクト・リレーショナル
    マッピングツール(ORM)

    Col1 Col2 Col3
    … … …
    … … …
    オブジェクト・リレーショナル
    データベース

    Col1 Col2 Col3
    … … …
    … … …
    ORMはアプリケーション・オブジェクトからリレーショナルへの変換をしやすくする
    レイヤーを追加するが、ミスマッチを根本的に解決するものではない

    View Slide

  8. Copyright © 2023, Oracle and/or its affiliates
    JSON Relational
    Duality
    Oracle Database 23c
    INTRODUCING

    View Slide

  9. アプリケーション開発の例- 学⽣の受講スケジュール
    学⽣の受講スケジュールを作成する
    アプリケーションを開発すると想定 STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    Copyright © 2023, Oracle and/or its affiliates
    9

    View Slide

  10. アプリケーションに必要なデータは、
    リレーショナル・スキーマ内の正規化された表に格納
    アプリケーション開発の例- 学⽣の受講スケジュール
    STUDENT
    STUID SNAME SINFO
    S3245 Jill …
    S8524 John …
    S1735 Jane …
    S3409 Jim …
    TEACHER
    TEACHID TNAME TINFO
    T123 Anika …
    T543 Adam …
    T789 Anita …
    T612 Alex …
    COURSE
    CID CNAME ROOM TIME TEACHID
    C123 MA_01 A102 14:00 T543
    C345 SCI_02 B405 16:00 T789
    C567 HIS_02 A102 14:00 T612
    C789 LA_01 A256 12:00 T543
    STUDENT COURSES
    SCID STUID CID
    1 S3245 C123
    2 S8524 C567
    3 S3245 C345
    4 S3409 C123
    Copyright © 2023, Oracle and/or its affiliates
    10

    View Slide

  11. アプリケーションに必要なデータは、
    リレーショナル・スキーマ内の正規化された表に格納
    アプリケーション開発の例- 学⽣の受講スケジュール
    Copyright © 2023, Oracle and/or its affiliates
    11
    STUDENT
    STUDENT_COURSES COURSE
    TEACHER
    stuid(PK)
    stuid(FK)
    cid(PK)
    cid(FK)
    teachid(PK)
    teachid(FK)

    View Slide

  12. 正規化された表を使⽤したアプリケーションの開発は
    ⾮常に柔軟だが、開発者にとっては必ずしも容易ではない
    アプリケーション開発の例- 学⽣の受講スケジュール
    Jillのスケジュールを作成するには、開発者は4つの表それぞれに
    対してデータベース操作を実⾏する必要がある
    STUDENT
    TEACHER
    COURSE
    STUDENT COURSES
    SQL
    SQL
    SQL
    SQL
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    Copyright © 2023, Oracle and/or its affiliates
    12

    View Slide

  13. リレーショナル・データと開発者
    データベース
    開発者にとっては、単⼀のデータベース操作で
    Jillのスケジュールを作成できることが理想的
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    Copyright © 2023, Oracle and/or its affiliates
    13

    View Slide

  14. JSONはそのシンプルさから、データ・アクセスおよびデータ交換形式として広く利⽤されている
    JSONドキュメント
    あらゆるデータに対応
    JSONドキュメントは、複雑な⾔語オブジェクトを
    名前と値のペアの単純な階層として
    表現することが可能
    送受信が簡単
    ⾃⼰記述型、⾃⼰完結型のフォーマットは、
    変更に柔軟に適応し、システム間での送受信が
    容易
    {
    "name1" : "String Value1",
    "name2" :
    {
    "name3" : "14:00",
    "name4" : 1234
    }
    }
    Copyright © 2023, Oracle and/or its affiliates
    14

    View Slide

  15. JSONは標準として広く利⽤されている
    Web Apps REST 開発ツール
    JavaScript
    Copyright © 2023, Oracle and/or its affiliates
    15

    View Slide

  16. 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 JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    Copyright © 2023, Oracle and/or its affiliates
    16

    View Slide

  17. 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 JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    Copyright © 2023, Oracle and/or its affiliates
    17

    View Slide

  18. ドキュメント・データベースは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"
    }
    ]
    }
    Database
    PUT
    GET
    Copyright © 2023, Oracle and/or its affiliates
    18

    View Slide

  19. Oracle Databaseは優れたドキュメント・データベース
    Oracleは、純粋なドキュメント・データベースより
    優れたドキュメント機能を提供
    1998年からXMLドキュメントをサポート
    2014年からJSONドキュメントをサポート
    すべてのリリースで継続的に機能を強化
    {
    "name1" : "String Value1",
    "name2" :
    {
    "name3" : "14:00",
    "name4" : 1234
    }
    }
    Copyright © 2023, Oracle and/or its affiliates
    19

    View Slide

  20. Oracle DatabaseにおけるJSON関連機能の主な進化
    • 12c Release 1
    JSONのサポートを開始(CLOB/BLOB/VARCHAR2列へのJSONの格納)
    • 12c Release 2
    JSONデータ・ガイドのサポート(JSONデータからビューや仮想列を作成)
    JSONデータ⽣成のためのSQL/JSONファンクションを実装(JSON_OBJECT、JSON_ARRAY等)
    • 18c
    JSONデータの格納および問合せ⽤の複数のSQL拡張機能を実装
    • 19c(2019年)
    JSON_SERIALIZE(バイナリJSONデータのテキスト化、出⼒フォーマットの指定)をサポート
    • 21c
    JSONデータ型(ネイティブ・バイナリ形式)をサポート
    Oracle Database API for MongoDBをサポート(ORDS 22.3以降)
    • 23c
    JSON Relational Dualityのサポート
    Oracle Databaseは優れたドキュメント・データベース
    Copyright © 2023, Oracle and/or its affiliates
    20

    View Slide

  21. Oracle Databaseは優れたドキュメント・データベース
    ドキュメントAPIまたはSQL APIを使⽤して、
    ドキュメントを簡単に格納、取得、分析および
    操作が可能
    • OracleはドキュメントのためのSQL拡張機能を
    オープンSQL標準に定期的に提供
    CREATE TABLE student_schedule(
    student_id number,
    schedule_doc JSON
    );
    SELECT schedule_doc
    FROM student_schedule s
    WHERE s.schedule_doc.student = 'Jill';
    Copyright © 2023, Oracle and/or its affiliates
    21

    View Slide

  22. SODA : Simple Oracle Document Access
    Oracleのドキュメント対応はドキュメント・データベースよりも優れている
    ドキュメント・データベースより
    優れている
    完全なドキュメントAPI
    -SODA
    -Oracle Database API
    for MongoDB
    1
    ドキュメント間での完全な
    ACID⼀貫性
    ドキュメントに対する分析、空間、
    グラフ、ML、並列処理
    2 3
    標準ベースのSQLによる
    ドキュメントへのアクセスを提供
    JavaScript、Javaまたは
    PL/SQLで記述された
    ストアド・プロシージャ
    ドキュメント・データベースより
    優れている
    Copyright © 2023, Oracle and/or its affiliates
    22

    View Slide

  23. アプリケーションにMongoDB互換のインターフェースを提供(MongoDB Shell、pymongo等)
    利⽤⼿順
    1. ORDSのzipファイルのダウンロード(バージョン22.3以降)
    https://www.oracle.com/database/sqldeveloper/technologies/db-actions/download/
    2. ORDSのインストールと構成
    ords install
    3. Oracle Database API for MongoDBの有効化
    ords config set mongo.enabled true
    4. ORDSの起動
    ords serve
    5. スキーマに対してORDSを有効化
    SQL > exec ORDS.ENABLE_SCHEMA;
    6. MongoDBクライアントからコマンドを実⾏
    student_schedule.find({"name":"Jill"})
    Oracle Database API for MongoDB
    Copyright © 2023, Oracle and/or its affiliates
    23
    ORDS : Oracle REST Data Services
    マニュアル︓Oracle REST Data Service Installation and Configuration Guide
    Oracle API for MongoDB Support
    サポートされる
    クライアント
    サポートされる
    バージョン
    mongosh 0.15.6
    MongoDB Tools 100.5.2
    Java 4.3.0
    Python 3.12.0
    Node.js 4.1.0
    C# 2.13.0
    Go 1.6.0

    View Slide

  24. ドキュメント・データベースの制限
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    STUDENT SCHEDULE FOR JACK
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 6:00 PM
    Room A115
    Teacher Alex
    Physics
    Science 102
    JSONドキュメントは、アプリケーションが
    データのアクセス形式として使⽤するのが簡単
    データのストレージ形式として使⽤すると、
    データの重複とデータの⼀貫性に関する
    問題が発⽣
    Copyright © 2023, Oracle and/or its affiliates
    24

    View Slide

  25. ドキュメント・データベースの制限
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    STUDENT SCHEDULE FOR JACK
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 6:00 PM
    Room A115
    Teacher Alex
    Physics
    Science 102
    JSONを使⽤して学⽣の受講スケジュールを
    保存すると、コースおよび教師の情報が
    各学⽣のスケジュールに重複して格納される
    重複データ
    • ⾮効率なデータの保存
    • データの更新コストが増⼤
    • データの⼀貫性を保つことが困難
    Copyright © 2023, Oracle and/or its affiliates
    25

    View Slide

  26. ドキュメント・データベースの制限
    {
    "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: JACK
    JSONを使⽤して学⽣の受講スケジュールを
    保存すると、コースおよび教師の情報が
    各学⽣のスケジュールに重複して格納される
    重複データ
    • ⾮効率なデータの保存
    • データの更新コストが増⼤
    • データの⼀貫性を保つことが困難
    Copyright © 2023, Oracle and/or its affiliates
    26

    View Slide

  27. 複数のユースケースで同じデータを利⽤する場合
    アプリケーションは時間の経過と共に
    必然的にユースケースが増えていく
    新しいユース・ケースで同じデータが使⽤されると、
    データの重複が増加する
    たとえば、教師の講義スケジュールの
    ユース・ケースを追加する場合
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    TEACHER SCHEDULE FOR ANITA
    Time 2:00 PM Room A312
    Time 4:00 PM Room B405
    Time 6:00 PM Room A151
    Science 102
    Copyright © 2023, Oracle and/or its affiliates
    27

    View Slide

  28. 複数のユースケースで同じデータを利⽤する場合
    教師の講義スケジュールのユース・ケースには、
    教師をルートとする新しいドキュメント形式が必要
    • ただし、学⽣のドキュメントと同じコース・データを共有
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    TEACHER SCHEDULE FOR ANITA
    Time 2:00 PM Room A312
    Time 4:00 PM Room B405
    Time 6:00 PM Room A151
    Science 102
    Copyright © 2023, Oracle and/or its affiliates
    28

    View Slide

  29. 複数のユースケースで同じデータを利⽤する場合
    {
    "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 affiliates
    29

    View Slide

  30. 複数のユースケースで同じデータを利⽤する場合
    {
    "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 affiliates
    30

    View Slide

  31. プラス
    あらゆるユース・ケースで両⽅のメリットを享受することは可能か
    リレーショナル
    • ユースケースの柔軟性
    • 問合せ可能性
    • ⼀貫性
    • ストレージ効率
    ドキュメント
    • ⾔語の型への簡単なマッピング
    • 俊敏なスキーマレス開発
    • 階層データ形式
    • 標準データ交換フォーマット
    JSON PLUS Relational
    Benefits
    Use Case Complexity
    JSON
    Relational
    Copyright © 2023, Oracle and/or its affiliates
    31

    View Slide

  32. 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 affiliates
    32

    View Slide

  33. JSON Relational Dualityはリレーショナル・モデルとドキュメント・モデルの両⽅の利点を兼ね備える
    JSON Relational Duality
    Copyright © 2023, Oracle and/or its affiliates
    33
    柔軟性の⾼いデータの利⽤
    正規化による効率的なデータの変更
    正規化による効率的なデータの保存
    開発が容易
    ⾔語の型へのマッピングが容易
    データの保存と取出しが容易

    View Slide

  34. JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    GraphQL構⽂を使⽤してstudent_schedule
    Dualityビューを宣⾔する⽅法の例
    ビューの構造が必要なJSONオブジェクトの構造を反映
    CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses
    {
    scid: scid
    course: course
    {
    time
    course: cname
    course_id: cid
    room
    teacher: teacher
    {
    teacher: tname
    teacher_id: teachid
    }
    }
    }
    };
    {
    ….
    [ {
    ….
    },
    {
    ..
    }
    ]
    }
    STUDENT SCHEDULE : JILL
    Copyright © 2023, Oracle and/or its affiliates
    34

    View Slide

  35. CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses
    {
    scid: scid
    course: course
    {
    time
    course: cname
    course_id: cid
    room
    teacher: teacher
    {
    teacher: tname
    teacher_id: teachid
    }
    }
    }
    };
    JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    JSONドキュメントを構成する
    データを含む表を指定
    TEACHER
    COURSE
    STUDENT
    STUDENT COURSE
    Copyright © 2023, Oracle and/or its affiliates
    35

    View Slide

  36. CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses
    {
    scid: scid
    course: course
    {
    time
    course: cname
    course_id: cid
    room
    teacher: teacher
    {
    teacher: tname
    teacher_id: teachid
    }
    }
    }
    };
    JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    各JSONプロパティの名前および
    その値を取得するための表の列名を指定
    STUDENT
    STUID SNAME SINFO
    S3245 Jill …
    S8524 John …
    S1735 Jane …
    S3409 Jim …
    Copyright © 2023, Oracle and/or its affiliates
    36

    View Slide

  37. CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses @delete @insert @update
    {
    scid: scid
    course: course
    {
    time
    course: cname
    course_id: cid
    room
    teacher: teacher
    {
    teacher: tname
    teacher_id: teachid
    }
    }
    }
    };
    JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    更新可能性ルールの指定
    (Dualityビュー student_schedule経由で
    student_coursesを更新可能、
    student、course、teacherは更新不可)
    Copyright © 2023, Oracle and/or its affiliates
    37

    View Slide

  38. 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 affiliates
    38

    View Slide

  39. 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' of
    table 'TEACHER' in JSON Relational Duality View 'STUDENT_SCHEDULE': Missing
    UPDATE annotation or NOUPDATE annotation specified.
    Help: https://docs.oracle.com/error-help/db/ora-40940/
    JSON Relational Dualityの定義
    Copyright © 2023, Oracle and/or its affiliates
    39

    View Slide

  40. CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses @delete @insert @update
    {
    scid: scid
    course @unnest
    {
    time
    course: cname
    course_id: cid
    room
    teacher @unnest
    {
    teacher: tname
    teacher_id: teachid
    }
    }
    }
    };
    JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    ネストされたオブジェクトのプロパティを
    親プロパティ内でネストしない場合に指定
    Copyright © 2023, Oracle and/or its affiliates
    40

    View Slide

  41. JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    @unnest 指定なし @unnest 指定あり
    JSON Relational Dualityの定義
    Copyright © 2023, Oracle and/or its affiliates
    41
    "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"
    }
    ]

    View Slide

  42. JSON Relational Dualityビューは、正規化された⾏をJSONドキュメントに組み込むためのレシピを宣⾔
    JSON Relational Dualityの定義
    Copyright © 2023, Oracle and/or its affiliates
    42
    CREATE OR REPLACE JSON DUALITY VIEW student_schedule AS
    SELECT 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 t
    WHERE c.teachid = t.teachid )}
    FROM course c
    WHERE c.cid = sc.cid )}
    FROM student_courses sc WITH INSERT UPDATE DELETE
    WHERE s.stuid = sc.stuid )]
    }
    FROM student s;
    SQL構⽂を使⽤してstudent_schedule
    Dualityビューを宣⾔する⽅法の例

    View Slide

  43. 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: JILL
    Copyright © 2023, Oracle and/or its affiliates
    43

    View Slide

  44. Tips
    Dualityビューのベースとなる表
    • 適切なPRIMARY KEY、UNIQUE KEY、FOREIGN KEYが設定されている必要がある
    • 検索パフォーマンス向上のためFOREIGN KEYが設定されている列にはインデックスを作成する
    Dualityビューで使⽤可能な列の型
    • VARCHAR2
    • NVARCHAR2
    • CHAR
    • NCHAR
    • NUMBER
    • BINARY_DOUBLE
    • BINARY_FLOAT
    • BOOLEAN
    • JSON
    Dualityビューの使⽤
    Copyright © 2023, Oracle and/or its affiliates
    44
    • DATE
    • TIMESTAMP
    • TIMESTAMP WITH TIME ZONE
    • INTERVAL YEAR TO MONTH
    • INTERVAL DAY TO SECOND
    • BLOB
    • CLOB
    • NCLOB
    • RAW

    View Slide

  45. Dualityビューの使⽤例
    SQLまたはドキュメントAPIを使⽤して
    Dualityビューにアクセス可能
    SELECT data
    FROM student_schedule s
    WHERE 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: JILL
    Copyright © 2023, Oracle and/or its affiliates
    45
    <SQL>︓JSON型のdata列にアクセス
    <ドキュメントAPI>︓ビューと同名のコレクションとしてアクセス

    View Slide

  46. Dualityビューの構造
    • Dualityビューは単⼀のJSON型の列(data)のみを持つ
    Dualityビューの使⽤例
    Copyright © 2023, Oracle and/or its affiliates
    46
    SQL> desc student_schedule
    Name Null? Type
    -------------------------- -------- ---------------
    DATA JSON
    SELECT data
    FROM student_schedule s
    WHERE s.data.name = 'Jill';

    View Slide

  47. Dualityビューに対する検索
    Dualityビューの使⽤例
    Copyright © 2023, Oracle and/or its affiliates
    47
    SQL> SELECT JSON_SERIALIZE(data PRETTY) json_data
    2 FROM student_schedule s
    3 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"
    },

    View Slide

  48. Dualityビューは、RESTを使⽤して⾮常に簡単に
    アクセス可能
    • Dualityビューからのドキュメントの取得(GET)
    • GETしたドキュメントに必要な変更を加える
    • Dualityビューへのドキュメントの書き戻し(PUT)
    データベースは、新しいドキュメントの変更を⾃動的に
    検出し、ビューのベースとなる表の⾏を変更
    • 同じデータを共有するすべてのDualityビューに
    変更が即時に反映される
    • 開発者は不整合を⼼配する必要がない
    ⾮常にシンプル
    データベース
    アプリ
    GET Doc
    PUT Doc
    Change Doc
    GET school.edu/student_schedule?q={"student":"Jill"}
    Copyright © 2023, Oracle and/or its affiliates
    48

    View Slide

  49. RESTではなくAPIを使⽤するアプリケーションは、
    以下のAPIを利⽤可能
    • Simple Oracle Document Access API(SODA)
    • Oracle MongoDB互換API
    (Oracle Database API for MongoDB)
    ⾮常にシンプル
    データベース
    アプリ
    PUT Doc
    Copyright © 2023, Oracle and/or its affiliates
    49
    GET Doc
    Change Doc

    View Slide

  50. 開発者はドキュメント中⼼のアプリを簡単に構築可能
    • 新しいドキュメントをリレーショナル・データとして格納
    • 既存のリレーショナル・データをドキュメントとして操作
    • リレーショナル・データベースの上にJSONベースのマイクロサービスを構築
    さらに、
    Oracleのコンバージド・データベースのすべてのメリットを享受可能
    きわめて⾼い柔軟性
    データベース
    Document
    Centric App
    Copyright © 2023, Oracle and/or its affiliates
    50

    View Slide

  51. シンプルなアプリケーション・オブジェクトの永続性
    TEACHER OBJECT
    Teacher Name: Anita
    Department: Science
    Supervisor: Amy
    Courses: Science 102,
    Math 203
    JSON PUT
    Duality View
    アプリケーション・オブジェクトを永続化するためには
    • 開発者は⾔語固有のオブジェクト表現をJSONに変換するだけ
    • あとはデータベースがJSON Duality ビューを使⽤して、
    ⾃動的にJSONを表に永続化
    JSONへの変換は、REST、JavaScriptなどの
    コーディング時に使⽤されることが多いため、
    開発者にとっては使いやすく簡単
    Copyright © 2023, Oracle and/or its affiliates
    51

    View Slide

  52. アプリケーション・オブジェクトのDualityビューによるメリット
    データベース内でアプリケーション・オブジェクトの
    永続性形式を宣⾔すると、多くの利点がある
    • オブジェクトとリレーショナルのミスマッチをブリッジ
    • ドキュメントAPIを使⽤することでアプリケーションが
    オブジェクトを操作しやすくなる
    • アプリケーション・オブジェクトの永続性フォーマットの⼀元化
    • クライアントの⾔語またはフレームワークに依存しない
    TEACHER OBJECT
    Teacher Name: Anita
    Department: Science
    Supervisor: Amy
    Courses: Science 102,
    Math 203
    JSON PUT
    Duality View
    Copyright © 2023, Oracle and/or its affiliates
    52

    View Slide

  53. Duality View
    アプリケーション・オブジェクトのDualityビューによるメリット
    シンプルさと標準化によるメリットだけではなく、
    データベースの持つ豊富な機能を
    アプリケーション・オブジェクトに対しても実装可能に
    • 分析
    • ETL(抽出、変換、ロード)
    • レプリケーション
    • テキスト索引
    • トリガー
    • 検証
    • セキュリティ・ルール
    • ビジネス・ルール
    TEACHER OBJECT
    Teacher Name: Anita
    Department: Science
    Supervisor: Amy
    Courses: Science 102,
    Math 203
    JSON PUT
    Copyright © 2023, Oracle and/or its affiliates
    53

    View Slide

  54. 透過的なスキーマの変更
    Dualityビューによって提供される抽象化により、
    透過的なアプリケーション・オブジェクトの展開が可能
    • アプリケーションで使⽤している表スキーマに対する変更を
    ビューを更新することでアプリケーションから隠蔽
    • 新しいアプリケーションに必要なJSONフォーマットへの変更は
    新しいビューを作成することで既存のアプリケーションから隠蔽
    DBの変更を
    隠蔽
    アプリの変更を
    隠蔽
    TEACHER OBJECT
    Teacher Name: Anita
    Department: Science
    Supervisor: Amy
    Courses: Science 102,
    Math 203
    Duality View
    Copyright © 2023, Oracle and/or its affiliates
    54

    View Slide

  55. 画期的なロックフリー同時実⾏性制御
    REST GETおよびPUT APIを使⽤している場合、
    従来のロックは機能しない
    • GETおよびPUTはステートレスAPI
    • トランザクションとロックは、ステートレス・コール間で保持できない
    JSON Relational Dualityは、ドキュメント操作のために
    新しい⾰新的なロックフリーの同時実⾏性制御プロトコルを実装
    Copyright © 2023, Oracle and/or its affiliates
    55

    View Slide

  56. 画期的なロックフリー同時実⾏性制御
    楽観的同時実効性制御と
    呼ばれる
    Change Doc
    GET Doc
    PUT Doc
    格納データが
    変更された場合
    に拒否
    データベース
    アプリ
    ドキュメントのベースとなるデータが、最初のドキュメントの
    読取り(GET)と後続の書込み(PUT)の間に
    変更された場合、データベースが⾃動的に検出
    • 変更が発⽣した場合、書込み操作は⾃動的に拒否され、
    エラーが返される
    • その後、アプリケーションは変更されたデータに基づいて、
    書込みを再実⾏可能
    Copyright © 2023, Oracle and/or its affiliates
    56

    View Slide

  57. ロックフリー同時実⾏性制御の利点
    1. ⼈間が考えている間はデータがロックされないため、
    対話型アプリケーションに最適
    2. 古いドキュメントによる書込みが拒否されるため、
    切断される可能性のあるモバイルアプリケーションに最適
    3. 失効しているキャッシュされたドキュメントの書込みが
    拒否されるため、ドキュメント・キャッシュに最適
    Copyright © 2023, Oracle and/or its affiliates
    57

    View Slide

  58. ETAGを使⽤
    ロックフリー同時実⾏性制御- 仕組み
    Get Doc
    ETA
    G
    データベース
    アプリ
    HTTPプロトコルでは、ETAGはWebページの
    内容の署名またはフィンガープリント
    Oracleは、ロックフリーの同時実⾏性制御を実装
    するために、HTTP ETAGをコア・データベースに
    独⾃に拡張
    • データベースはETAGを⾃動的に計算し、
    戻されるドキュメント⾃体に挿⼊
    • ETAGはドキュメントのベースとなる列の値から算出される
    ハッシュ値
    • ドキュメントのベースとなる列の値から算出される
    ハッシュ値
    Copyright © 2023, Oracle and/or its affiliates
    58

    View Slide

  59. ロックフリー同時実⾏性制御- 仕組み
    Copyright © 2023, Oracle and/or its affiliates
    59
    SQL> SELECT json_serialize(data PRETTY)
    2 FROM student_schedule s
    3 WHERE s.data.name = 'Jill';
    JSON_SERIALIZE(DATAPRETTY)
    -----------------------------------------------
    {
    "_metadata" :
    {
    "etag" : "D341258911E06C5956538288BAC4CD91",
    "asof" : "000000000026E1FC"
    },
    "name" : "Jill",
    "student_id" : "S3245",
    "schedule" :
    [
    ← ETAG︓
    ドキュメントのベースとなる列の値から算出される
    ハッシュ値

    View Slide

  60. ロックフリー同時実⾏性制御- 仕組み
    PUT Doc
    変更されたドキュメントがPUTでデータベースに
    書き戻される時
    • データベースは、ドキュメントのベースとなる⾏のデータが
    GETによって取得したETAGの値と⼀致していることを検証
    • ⾏のETAGの値が⼀致する場合、⾏は⾃動的に更新される
    • ⼀致しない場合は別のユーザーによってデータが変更されて
    いるため、PUT操作は拒否される
    • 新しいデータを使⽤してPUTを再試⾏する
    Change Doc
    ETA
    G
    データベース
    アプリ
    Reject
    if ETAG
    of Data
    Changed
    Copyright © 2023, Oracle and/or its affiliates
    60
    ERROR 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が⼀致しない(データが変更されている)場合︓

    View Slide

  61. ETAGによる同時実⾏性制御は値ベース
    更新の競合はETAGを使⽤して
    データの値⾃体を検証することで検出
    ロックやバージョンをデータに追加する形ではない
    値ベースの同時実⾏性制御
    Put Doc
    ETA
    G
    Change Doc
    データベース
    アプリ
    Copyright © 2023, Oracle and/or its affiliates
    61

    View Slide

  62. 値ベースであるため、ETAGは多くの異なるドキュメントで
    共有されるデータへの更新を⾃動的に同期
    • 例︓コース・データが多くの学⽣のドキュメントで共有されている
    • 例︓教師や学⽣のドキュメントのように、異なるドキュメント・ルートを
    持つドキュメントによって共有される場合
    このような場合、従来のロックまたはバージョンベースの
    同時実⾏性制御はうまく機能しない
    値ベースは同じデータを使⽤した異なるビューでも機能
    STUDENT SCHEDULE FOR JILL
    Time 4:00 PM
    Room B405
    Teacher Anita
    Time 2:00 PM
    Room A102
    Teacher Adam
    Math 101 Science 102
    TEACHER SCHEDULE FOR ANITA
    Time 2:00 PM Room A312
    Time 4:00 PM Room B405
    Time 6:00 PM Room A151
    Science 102
    Copyright © 2023, Oracle and/or its affiliates
    62

    View Slide

  63. @nocheckにより特定のプロパティをETAGの計算対象から除外
    値ベースにより重要でない変更を無視することが可能
    ETAGの計算対象からroomを除外すると、コースの場所が変更されていた
    場合に発⽣するDualityビューに対するPUTの失敗を回避可能
    CREATE OR REPLACE JSON DUALITY VIEW FROM student_schedule AS
    student
    {
    name: sname
    student_id: stuid
    schedule: student_courses @delete @insert @update
    {
    course: course
    {
    time
    course: cname
    course_id: cid
    room @nocheck
    teacher: teacher
    {
    teacher: tname
    teacher_id: tid
    }
    } } };
    ETAGの計算対象から、更新によってPUTが
    拒否されるべきでないデータを除外することが
    可能
    • デフォルトではドキュメント内の全てのフィールドが
    ETAGの計算対象
    • @nocheckを指定したプロパティはETAGの計算から除外
    • 表レベル、列レベル(プロパティレベル)で指定可能
    • 列レベルの指定が優先される
    • 以下のような場合には、すべてのプロパティを除外可能
    - アプリケーションで同時実⾏性制御を実施している
    - アプリケーションがシングルスレッドで同時更新が起きない
    Copyright © 2023, Oracle and/or its affiliates
    63

    View Slide

  64. データベース内ドキュメントのすべてのユースケース
    開発者はデータをリレーショナルとして格納可能
    データ・スキーマが既知の場合に最適

    1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    Copyright © 2023, Oracle and/or its affiliates
    64

    View Slide


  65. 1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    データベース内ドキュメントのすべてのユースケース
    開発者はデータをリレーショナルとして格納可能
    • 標準のSQLを使⽤したリレーショナルとしてのアクセス
    SQL
    API
    Copyright © 2023, Oracle and/or its affiliates
    65

    View Slide


  66. 1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    データベース内ドキュメントのすべてのユースケース
    開発者はデータをリレーショナルとして格納可能
    • 標準のSQLを使⽤したリレーショナルとしてのアクセス
    • Dualityビューを使⽤したドキュメントとしてのアクセス
    SQL
    API
    ドキュメント
    API
    Copyright © 2023, Oracle and/or its affiliates
    66

    View Slide


  67. 1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    {
    "name1" : "String Value1",
    "name2" :
    {
    "name3" : "14:00",
    "name4" : 1234
    }
    }
    データベース内ドキュメントのすべてのユースケース
    開発者はデータをリレーショナルとして格納可能
    • 標準のSQLを使⽤したリレーショナルとしてのアクセス
    • Dualityビューを使⽤したドキュメントとしてのアクセス
    開発者はデータをドキュメントとして格納可能
    SQL
    API
    ドキュメント
    API
    スキーマが動的または開発中の
    コレクションまたは表の列に最適
    Copyright © 2023, Oracle and/or its affiliates
    67

    View Slide


  68. 1 2 3
    … … …
    … … …
    … … …
    … … …

    1 2 3
    … … …
    … … …
    … … …
    … … …

    列1 列2 列3
    … … …
    … … …
    … … …
    … … …
    {
    "name1" : "String Value1",
    "name2" :
    {
    "name3" : "14:00",
    "name4" : 1234
    }
    }
    データベース内ドキュメントのすべてのユースケース
    開発者はデータをリレーショナルとして格納可能
    • 標準のSQLを使⽤したリレーショナルとしてのアクセス
    • Dualityビューを使⽤したドキュメントとしてのアクセス
    開発者はデータをドキュメントとして格納可能
    • JSONデータ・ガイドを使⽤してJSONデータに対して
    リレーショナル・ビューを作成し、リレーショナルとしてアクセス
    SQL
    API
    ドキュメント
    API
    Copyright © 2023, Oracle and/or its affiliates
    68

    View Slide


  69. 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からドキュメントとしてアクセス
    SQL
    API
    ドキュメント
    API
    Copyright © 2023, Oracle and/or its affiliates
    69

    View Slide


  70. 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からドキュメントとしてアクセス
    SQL
    API
    ドキュメント
    API
    Copyright © 2023, Oracle and/or its affiliates
    70

    View Slide


  71. 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 affiliates
    71

    View Slide

  72. JSON Relational Dualityのメリット
    72 Copyright © 2023, Oracle and/or its affiliates
    アプリケーション・オブジェクトを簡単に
    JSONとして永続化および操作し、
    オブジェクトとリレーショナルの
    ミスマッチをブリッジ可能
    Dualityビューを使⽤すると
    データをドキュメントまたは表として
    透過的に読み書き可能
    値ベースの同時実⾏性制御により
    ドキュメントと表の間で⼀貫性を確保
    ステートレスAPI、対話型ユース・ケース、モバイル切断クライアントを実現

    View Slide

  73. JSON Relational Dualityのメリット
    ドキュメント開発者
    73 Copyright © 2023, Oracle and/or its affiliates
    JSON Relational Dualityは
    JSONの開発のシンプルさと
    リレーショナルのユースケースの拡張性を提供
    既存のリレーショナル・データを使⽤して
    ドキュメントベースのアプリケーションを簡単に構築し、
    Oracleのコンバージド・データベースの
    すべての⾼度な機能を利⽤可能
    データ重複や⼀貫性の問題を発⽣させることなく
    ドキュメント・スキーマを各ユースケースに最適化

    View Slide

  74. JSON Relational Dualityのメリット
    リレーショナル開発者
    74 Copyright © 2023, Oracle and/or its affiliates
    ドキュメント指向のアプリケーションで作成されたデータを使⽤した
    SQLベースのアプリケーション作成やデータ分析が可能
    JSON Relational Dualityは
    ORMよりも効率的で、
    より⼀元化され、かつ⼀貫性が⾼い
    1回の呼出しおよび1回のラウンド・トリップで
    アプリケーションのユースケースに必要な
    すべての⾏に簡単にアクセス可能
    ORM: Object Relational Mapping

    View Slide

  75. JSON Relational Dualityのメリット
    データベース管理者、インフラ管理者
    75 Copyright © 2023, Oracle and/or its affiliates
    データが⼀元化されるため、
    必要なストレージコストが削減
    データベースが⼀元化されるため
    管理・運⽤⼯数が削減
    データが⼀元化されるため、
    データの移動やデータ連携が不要

    View Slide

  76. DBの運⽤、DBストレージ、DBデータ、アプリケーション、ツールが全て別々、データ連携にはETLが必要
    Before JSON Ralational Duality
    Copyright © 2023, Oracle and/or its affiliates
    76
    Query API
    REST 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
    }
    }
    SQL
    Interface
    Relational
    (Table)
    JSON
    (Document) App based on
    Document DB
    App based on
    Relational DB
    find()
    SELECT
    INSERT
    UPDATE
    DELETE
    Oracle Database ドキュメントDB
    insertOne()
    updateOne()
    deleteOne()
    insertMany()
    updateMany()
    deleteMany()
    ETL

    View Slide

  77. DBの運⽤、DBストレージ、DBデータは⼀つに集約、ETL不要、アプリケーション、ツールは⽤途によって使い分け
    After JSON Ralational Duality
    Copyright © 2023, Oracle and/or its affiliates
    77
    REST API
    SODA
    Oracle
    Database
    API for
    MongoDB
    {
    name1 : value1,
    name2 :
    {
    name3 : 100,
    name4 : 14:00
    }
    }
    {
    name1 : value1,
    name2 :
    {
    name3 : 100,
    name4 : 14:00
    }
    }
    {
    name1 : value1,
    name2 :
    {
    name3 : 100,
    name4 : 14:00
    }
    }
    SQL
    Interface
    Relational
    (Table)
    JSON
    (Duality View) App based on
    Document DB
    App based on
    Relational DB
    JSON Relational Duality
    SELECT
    INSERT
    UPDATE
    DELETE
    Oracle
    find()
    insertOne()
    updateOne()
    deleteOne()
    insertMany()
    updateMany()
    deleteMany()

    View Slide

  78. • マニュアル
    JSON-Relational Duality Developer's Guide
    • チュートリアル
    JSON Relational Duality tutorials
    • LiveLabs
    AutoREST with JSON Relational Duality Views in 23c Free
    • Blog
    JSONとリレーショナルの⼆⾯性: ドキュメント、オブジェクトおよびリレーショナル・モデルの⾰新的な統合
    • JSON Relational Dualityビューの制限事項
    Oracle Database 23c リリース・ノート︓JSON Relational Dualityビューの制限
    JSON Relational Duality 参考情報
    Copyright © 2023, Oracle and/or its affiliates
    78

    View Slide

  79. 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 affiliates
    79

    View Slide

  80. Copyright © 2023, Oracle and/or its affiliates
    80
    その他のJSON関連の新機能

    View Slide

  81. 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 affiliates
    81

    View Slide

  82. 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 affiliates
    82

    View Slide

  83. View Slide