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

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

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

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

  • 識別列が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型の列に明示的に存在するドキュメント・サブオブジェクトには当てはまりません。