データ型の階層
Oracle NoSQL Databaseデータ・モデルでは、前述のタイプ間のサブタイプとスーパータイプの関係も定義されます。この関係は、T型がS型のサブタイプである場合はtrue、それ以外の場合はfalseを返すis_subtype(T, S)関数として表現できます。is_subtype(T, S)は次の場合にtrueを返します。
- TとSは同じ型です。したがって、すべての型がそれ自体のサブタイプになります。TがSのサブタイプであり、TがSに等しくない場合、T型は別のS型の適切なサブタイプであると言います。
- SはANY型です。したがって、すべての型がANYのサブタイプです。
- SはANYATOMIC型、Tはアトミック型です。
- SはANYJSONATOMIC、Tは数値型のいずれかであるか、STRING型またはBOOLEAN型です。
- SはNUMBER、Tは他のいずれかの数値型です。
- SはLONG、TはINTEGERです。
- SはDOUBLE、TはFLOATです。
- SはTIMESTAMP(p2)、TはTIMESTAMP(p1)で、p1 <= p2です。
- SはBINARY、TはFIXED_BINARYです。
- SはARRAY(T2)、TはARRAY(T1)で、T1はT2のサブタイプです。
- SはMAP(T2)、TはMAP(T1)で、T1はT2のサブタイプです。
- SとTはどちらもレコード型であり、(a)両方の型に同じフィールド名が同じ順序で含まれ、(b)各フィールドについて、Tの型はSの型のサブタイプであり、(c)フィールドがTでNULL値可能である場合は、SでもNULL値可能になります。
- SはJSONであり、Tは、(a)要素タイプがJSONのサブタイプである配列、または(b)値タイプがJSONのサブタイプであるマップ、または(c) ANYJSONATOMICまたはそのいずれかのサブタイプです。
注意:
is_subtype関係は推移的です。つまり、A型がB型のサブタイプで、BがCのサブタイプである場合、AはCのサブタイプです。通常のサブタイプ置換ルールはSQL for Oracle NoSQL Databaseでサポートされているため、is_subtype関係は重要です。操作でT型の入力項目が必要な場合、S型の項目でも操作できます。ここで、SはTのサブタイプです。ただし、このルールには次の2つの例外があります。
- DOUBLEおよびFLOATはNUMBERのサブタイプです。ただし、DOUBLEおよびFLOATには、ドメイン内に3つの特別な値が含まれています。
- NaN (非数)
- 正の無限大
- 負の無限大
これらの3つの値は、NUMBERのドメイン内にありません。DOUBLEまたはFLOAT型は、3つの特別な値のいずれでもない場合、NUMBER型に指定できます。指定しない場合、エラーが発生します。
- 型がARRAY (JSON)またはMAP (JSON)の適切なサブタイプである項目は、次のものとして使用できません。
- フィールド・タイプがJSON、ARRAY (JSON)またはMAP (JSON)の場合のRECORD/MAPフィールド値
- 要素タイプがJSON、ARRAY (JSON)またはMAP (JSON)であるARRAYの要素
これは、強く型指定されたデータがJSONデータに挿入されないようにするためです。
たとえば、JSONドキュメントM、つまり、関連付けられた型がMAP (JSON)であるMAP値を考えてみます。Mには、INTEGERのみを含むARRAY値Aを含めることができます。ただし、Aに関連付けられた型をARRAY (INTEGER)にすることはできません。ARRAY (JSON)である必要があります。AがARRAY (INTEGER)型の場合、ユーザーはINTEGER以外の値をAに追加できません。つまり、ユーザーはJSONドキュメントを保持する方法でJSONドキュメントを更新できません。