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_id
とdate
)がある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
型の列を明示的に示すドキュメント・サブオブジェクトには適用されません。