24.10 文書セットごとの複数のデータ・ガイド
データ・ガイドは、所定のJSON文書セットの形状を反映しています。JSON列に、異なる構造または型情報を持つ異なる文書の型が含まれる場合、文書の型別に異なるデータ・ガイドを作成して使用できます。
異なる種類のJSON文書用のデータ・ガイド
JSON文書は、規定のスキーマに従う必要はなく、通常は従うことはありません。これは、所定のアプリケーションで同様に使用される文書の場合も当てはまります。これらは構造的に(形状)異なる可能性があり、フィールド型が異なる可能性があります。
JSONデータ・ガイドは、所定の文書セットの構造的情報と型情報を要約します。一般に、所定のセット内の文書の構造的情報と型情報が類似するほど、結果のデータ・ガイドの有用性は高まります。
データ・ガイドは、JSONデータの所定の列に対して作成されます。列に異なる種類の文書(たとえば発注書と健康記録)が含まれる場合、その列に単一のデータ・ガイドを用意しても、用途が限られると考えられます。
この懸念に対処する1つの方法は、異なるJSON列に異なる種類のJSON文書を配置することです。ただし、その他の事項を考慮した結果、同じ列内に異なる種類の文書を混在させることを選ぶ場合があります。
さらに、同じ列に格納すると決定した同じ一般的な種類の文書が、それにもかかわらず系統的な方法が比較的異なる場合があります。これには、形状や型情報が発展する文書の場合が含まれます。たとえば、税情報の文書の構造が年々変更される可能性があります。
データ・ガイドの作成時に、要約する情報を決定できます。そのため、同じJSON列に異なるデータ・ガイドを作成し、文書セットの異なるサブセットを表現できます。
これに関するもう1つの対処法は、JSONでない個別の列を同じ表内に設け、JSON列内の文書のラベルまたは分類に使用することです。
例に使用されている発注書の文書の場合、構造が年々大幅に変更される可能性があると考えると、形状が類似したサブセットにグループ化するために列date_loaded
を表j_purchaseorder
内で使用できます。例24-17では2015の発注書の文書を追加し、例24-18では2016の発注書の文書を追加します。(例4-3で追加された2014年の文書と比較します。)
複数のデータ・ガイドを作成するためのSQL集計関数の使用
Oracle SQLファンクションjson_dataguide
は、実際は集計関数です。集計関数は、単一行ではなく行のグループに基づいて1つの結果行を戻します。通常SELECT
リストの中でGROUP BY
句を持つ問合せに使用され、問い合せられた表またはビューの行をグループに分割します。集計関数は行の各グループに適用され、各グループの単一の結果行を返します。たとえば、集計関数avg
は、値グループの平均値を返します。
ファンクションjson_dataguide
はJSONデータを集計し、データの要約または仕様を作成します。これはJSON文書の形式で返されます。言い換えると、適用先のJSON文書の各グループについて、データ・ガイドが返されます。
GROUP BY
を省略すると、このファンクションは対象のJSON列内のすべてのJSONデータを要約した単一のデータ・ガイドを返します。
例24-19では、JSON列data
の文書を問い合せて、それらをグループ化し、列date_loaded
の各年に1つずつで、合計3つのデータ・ガイドを生成します。
例24-17 2015発注書の文書の追加
2015発注書形式は、部品番号、参照、明細項目のみ最上位フィールドとして使用し、これらのフィールドは接頭辞PO_
を使用します。各明細項目に、部品番号と数量のみが含まれます。
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-JUN-2015'),
'{"PO_Number" : 4230,
"PO_Reference" : "JDEER-20140421",
"PO_LineItems" : [ {"Part_Number" : 230912362345,
"Quantity" : 3.0} ]}');
例24-18 2016発注書の文書の追加
2016形式は、PO_ID
をPO_Number
のかわりに、PO_Ref
をPO_Reference
のかわりに、PO_Items
をPO_LineItems
のかわりに、Part_No
をPart_Number
のかわりに、Item_Quantity
をQuantity
のかわりに使用します。
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-MAR-2016'),
'{"PO_ID" : 4230,
"PO_Ref" : "JDEER-20140421",
"PO_Items" : [ {"Part_No" : 98981327234,
"Item_Quantity" : 13} ]}');
例24-19 集計ファンクションJSON_DATAGUIDEを使用した複数のデータ・ガイドの作成
この例は、SQL集計関数json_dataguide
を使用して、年固有の形式につき1つ、合計3つのフラット脚注1・データ・ガイドを取得します。2014のデータ・ガイドが部分的にのみ示されます。このガイドは、統計フィールドがないことを除き、発注書の文書のフラット・データ・ガイドからのデータ・ガイドと同じです。(ファンクションjson_dataguide
によって返されるデータ・ガイドには、統計フィールドは含まれません。
SELECT extract(YEAR FROM date_loaded), json_dataguide(data)
FROM j_purchaseorder
GROUP BY extract(YEAR FROM date_loaded)
ORDER BY extract(YEAR FROM date_loaded) DESC;
EXTRACT(YEARFROMDATE_LOADED)
----------------------------
JSON_DATAGUIDE(DATA)
--------------------
2016
[
{
"o:path" : "$.PO_ID",
"type" : "number",
"o:length" : 4
},
{
"o:path" : "$.PO_Ref",
"type" : "string",
"o:length" : 16
},
{
"o:path" : "$.PO_Items",
"type" : "array",
"o:length" : 64
},
{
"o:path" : "$.PO_Items.Part_No",
"type" : "number",
"o:length" : 16
},
{
"o:path" : "$.PO_Items.Item_Quantity",
"type" : "number",
"o:length" : 2
}
]
2015
[
{
"o:path" : "$.PO_Number",
"type" : "number",
"o:length" : 4
},
{
"o:path" : "$.PO_LineItems",
"type" : "array",
"o:length" : 64
},
{
"o:path" : "$.PO_LineItems.Quantity",
"type" : "number",
"o:length" : 4
},
{
"o:path" : "$.PO_LineItems.Part_Number",
"type" : "number",
"o:length" : 16
},
{
"o:path" : "$.PO_Reference",
"type" : "string",
"o:length" : 16
}
]
2014
[
{
"o:path" : "$.User",
"type" : "string",
"o:length" : 8
},
{
"o:path" : "$.PONumber",
"type" : "number",
"o:length" : 4
},
...
{
"o:path" : "$.\"Special Instructions\"",
"type" : "string",
"o:length" : 8
}
]
3 rows selected.
関連項目:
Oracle Database SQL言語リファレンス(SQLファンクションjson_dataguide
の詳細)
親トピック: JSONデータ・ガイド
脚注の凡例
脚注1: ファンクションjson_dataguideにオプションの2番目の引数としてDBMS_JSON.FORMAT_HIERARCHICAL
またはDBMS_JSON.FORMAT_SCHEMA
が渡された場合、結果はそれぞれ3つの階層データ・ガイドまたはスキーマ・データ・ガイドとなります。