6 二面性ビューのドキュメント識別子フィールド

二面性ビューによってサポートされるドキュメントには、必ず、その最上位レベルにドキュメント識別子フィールド_idが含まれています。これは、そのビューの基になるルート表の識別列(主キー列、アイデンティティ列、一意制約または一意索引がある列)に対応付けられています。フィールド値は様々な形式を使用できます。

(アイデンティティ列とは、表の行ごとに自動的に一意に数値が生成される列です。キーワードGENERATED BY DEFAULT ON NULL AS IDENTITYを使用して宣言します。)

多くの場合、このような識別列は1つしかなく、主キー列です。主キー列が複数あるときは、主キーが複合であると表現する場合があります。

  • 識別列が1つのみの場合は、二面性ビューを定義するときにフィールド_idの値としてそれを使用します。

  • あるいは、フィールド_idの値としてオブジェクトを使用できます。そのオブジェクトのメンバーにより、値が識別列であるフィールドを指定します。各識別列にフィールドがない場合は、エラーが発生します。

    識別列が1つのみの場合でも、_idにオブジェクト値を使用できます。そのようにすると、わかりやすいフィールド名を指定できます。

ノート:

二面性ビューの最上位レベルには、ルート表の特定の行、つまり対応するドキュメントを一意に識別するために、_idフィールドが必要です。

二面性ビューをレプリケートするには、各ドキュメントのサブオブジェクト脚注1に、値がその表の識別列である最上位フィールドがあることも確認する必要があります。つまり、このような表の行識別子フィールドに対応する列は、そのサブオブジェクトの基礎となる表の行を一意に識別する必要があります。

ドキュメント識別子フィールドの場合と同様に、行識別子フィールドに対応する列は、その表の主キー列、アイデンティティ列、一意制約または一意索引を持つ列のいずれかです。

ドキュメント識別子フィールドの名前は_idである必要があります。行識別子フィールドには任意の名前を付けることができますが、その名前が_idの場合は、対応する列によって表の行が一意に識別されるようにする必要があります

例6-1 主キー列値があるドキュメント識別子フィールド_id

二面性ビューrace_dvの場合は、単一の主キー列race_idの値が、フィールド_idの値として使用されています。このビューでサポートされているドキュメントは、{"_id" : 1,…}のようになります。

GraphQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  race {_id     : race_id
        name    : name
        laps    : laps @NOUPDATE
        date    : race_date
        podium  : podium @NOCHECK,
        result  : ...};

SQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  SELECT JSON {'_id'    : r.race_id,
               'name'   : r.name,
               'laps'   : r.laps WITH NOUPDATE,
               'date'   : r.race_date,
               'podium' : r.podium WITH NOCHECK,
               'result' : ...}
  FROM race r;

例6-2 オブジェクト値があるドキュメント識別子フィールド_id

二面性ビューrace_dvの場合、フィールド_idの値は単一のメンバーがあるオブジェクトであり、それにより、単一の主キー列race_idが、わかりやすいフィールド名raceIdにマップされています。このビューでサポートされているドキュメントは、{"_id" : {"raceId" : 1},...}のようになります。

GraphQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  race {_id @nest {race_id}
        name    : name
        laps    : laps @NOUPDATE
        date    : race_date
        podium  : podium @NOCHECK,
        result  : ...};

SQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  SELECT JSON {'_id'    : {'raceId' : r.race_id},
               'name'   : r.name,
               'laps'   : r.laps WITH NOUPDATE,
               'date'   : r.race_date,
               'podium' : r.podium WITH NOCHECK,
               'result' : ...}
  FROM race r;

代替のカーレース設計では、かわりに、複数の識別列(race_iddate)があるrace表が使用されており、それらすべての識別列によって行が識別されます。その場合、そのビューでサポートされているドキュメントは、{"_id" : {"raceId" : 1, "date" : "2022-03-20T00:00:00"},...}のようになります。

GraphQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  race {_id @nest {raceId: race_id, date: race_date}
        name    : name
        laps    : laps @NOUPDATE
        podium  : podium @NOCHECK,
        result  : ...};

SQL:

CREATE JSON RELATIONAL DUALITY VIEW race_dv AS
  SELECT JSON {'_id'    : {'raceId' : r.race_id, 'date' : r.race_date},
               'name'   : r.name,
               'laps'   : r.laps WITH NOUPDATE,
               'podium' : r.podium WITH NOCHECK,
               'result' : ...}
  FROM race r;


脚注一覧

脚注1: これは、ドキュメントに埋め込まれているJSON型の列を明示的に示すドキュメント・サブオブジェクトには適用されません。