データ型の階層

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つの例外があります。
  1. DOUBLEおよびFLOATはNUMBERのサブタイプです。ただし、DOUBLEおよびFLOATには、ドメイン内に3つの特別な値が含まれています。
    1. NaN (非数)
    2. 正の無限大
    3. 負の無限大

    これらの3つの値は、NUMBERのドメイン内にありません。DOUBLEまたはFLOAT型は、3つの特別な値のいずれでもない場合、NUMBER型に指定できます。指定しない場合、エラーが発生します。

  2. 型がARRAY (JSON)またはMAP (JSON)の適切なサブタイプである項目は、次のものとして使用できません。
    1. フィールド・タイプがJSON、ARRAY (JSON)またはMAP (JSON)の場合のRECORD/MAPフィールド値
    2. 要素タイプが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ドキュメントを更新できません。