複合データ型

複合データ型のインスタンスは、複数の値を含み、ネストされた値へのアクセスを提供します。現在、Oracle NoSQL Databaseは、次の種類の複合値をサポートしています。

表2-3 複合データ型

データ型 説明
ARRAY (T) 一般に、配列はゼロ以上の項目を順序付けしたコレクションです。配列の項目は要素と呼ばれます。配列にNULL値を含めることはできません。

ARRAY (T)のインスタンスは、要素がすべてT型のインスタンスである配列です。Tは配列の要素型と呼ばれます。

型: ARRAY (INTEGER)

型インスタンス: [600004,560076,01803]

MAP (T) 一般に、マップはゼロ個以上のキーと項目のペアの順序付けられていないコレクションであり、すべてのキーは文字列です。マップ内のキーは一意である必要があります。キーと項目のペアはフィールドと呼ばれます。キーはフィールド名と呼ばれ、関連する項目はフィールド値と呼ばれます。マップにNULLフィールド値を含めることはできません。

MAP (T)のインスタンスは、フィールド値がすべてT型のインスタンスであるマップです。Tはマップの値タイプと呼ばれます。

型: MAP(INTEGER)

型インスタンス: { "Chennai":600004, "Bangalore":560076, "Boston":01803 }

RECORD (k1 T1 n1, k2 T2 n2, ….…, kn Tn nn) 一般に、レコードは1つ以上のキーと項目のペアの順序付けられたコレクションであり、すべてのキーは文字列です。レコード内のキーは一意である必要があります。キーと項目のペアはフィールドと呼ばれます。キーはフィールド名と呼ばれ、関連する項目はフィールド値と呼ばれます。レコードには、フィールド値としてNULLが含まれる場合があります。

RECORD (k1 T1 n1, k2 T2 n2, ….…, kn Tn nn)のインスタンスは、正確にn個のフィールドのレコードであり、各フィールドiについて、(a)フィールド名はki、(b)フィールド値はTi型のインスタンス、(c)フィールドは、フィールド値をNULLにできるかどうかを指定するNULL値可能プロパティniに準拠します。

マップや配列とは異なり、レコードのフィールドを追加または削除することはできません。これは、フィールドの数とフィールド名が、レコード値に関連付けられたレコード型定義の一部であるためです。

型: RECORD(country STRING, zipcode INTEGER, state STRING, street STRING)

型インスタンス: { "country":"US", "zipcode":600004, "state":"Arizona", "street":"4th Block" }

例2-1 複合データ型

次の例は、データが様々な複合データ型に格納される方法の違いを示しています。

郵便番号の数が事前にわからない場合に複数の都市の郵便番号を格納するには、配列を使用できます。

Declaration:
ARRAY(INTEGER)
Example:
[600004,560076,01803]

複数の都市の名前を郵便番号とともに格納する場合、郵便番号の数がわからない場合は、マップを使用できます。

Declaration:
MAP(INTEGER)
Example:
{
"Chennai":600004,
"Bangalore":560076,
"Boston":01803
}

レコードは、順序付けられたコレクションに使用されます。大きいデータ・セットの一部として郵便番号を格納する場合は、レコードを使用できます。この例では、郵便番号のみがレコードに格納されます。

Declaration:
RECORD(zipcode INTEGER)
Example:
{
"zipcode":600004
}

複数の複合データ型を組み合せて、より複雑なデータを格納できます。次の例では、同じ郵便番号データについて、2つの複合データ型を組み合せて情報を格納します。

Declaration:
ARRAY(RECORD(area STRING, zipcode INTEGER))
Example:
[
    {"area":"Chennai","zipcode":600004},
    {"area":"Bangalore","zipcode":560076},
    {"area":"Boston","zipcode":01803}
]

例2-2 複合データ型

この例では、複雑なデータを格納するためにマップとレコードを宣言する方法の違いを示しています。

次のデータを考えてみます。

{
"name":"oracle",
"city":"Redwood City",
"zipcode":94065,
"offices":["Chennai","Bangalore","Boston"]
}

前述のデータでは、次に示すようにマップとレコードを宣言します。

Record
(
name STRING,
city STRING,
zipcode INTEGER,
offices Array(STRING)
)
Map(ANY)