NoSQLデータベースでのトランザクション

Oracle NoSQL Databaseでは、トランザクションは、単一のデータベース操作を伴う論理的でアトミックな作業単位として扱われます。

データベース内のそれぞれのデータ変更は、システムによって管理される1つのトランザクションで実行されます。データベース開発者は、トランザクションの開始/終了の概念がないため、複数の操作を1つのトランザクションにグループ化できません。データベースでは、トランザクション・セマンティクスは、多くの場合、ACIDプロパティによって記述されます。

ACIDプロパティ

Oracle NoSQL Databaseでは、トランザクションにより次のすべてのプロパティが保持され、開発者はそれらの一部を制御できます。
  • 原子性: トランザクション全体が完了または失敗します。中間の状態はなく、部分的なトランザクションはありません。
  • 一貫性: トランザクションはデータベースを有効な状態のままにします。
  • 分離: 2つのトランザクションが互いに混在または干渉しません。2つのトランザクションが順番に実行されても、パラレルに実行されても、開発者にとっては同じ結果になります。
  • 永続性: トランザクションの変更は保存され、変更はあらゆるタイプの障害(ネットワーク、ディスク、CPUまたは電源障害)後も存続します。

開発者は、Oracle NoSQL Databaseダイレクト・ドライバでのアプリケーションのニーズに応じて、幅広い一貫性レベルを定義できます。また、Oracle NoSQL Databaseドライバ(通常はSDKと呼ばれる)では、最終的および絶対的な一貫性もサポートされます。

開発者は、Oracle NoSQL Databaseダイレクト・ドライバを使用して、データベース内の更新された行が失敗しても存続するように、永続性を構成することもできます。永続性はSDKでは構成できません。

原子性および分離は構成できませんが、Oracle NoSQL Databaseでは、アプリケーション・ニーズのためのパフォーマンスをトレードオフするために、一貫性および永続性ポリシーを制御できます。一部のNoSQLデータベースでは、最終的な一貫性のみがサポートされ、絶対的な一貫性のメカニズムはありません。

シャード・キーは、Oracle NoSQLデータベースでACIDプロパティを取得する際に重要な役割を果たします。たとえば、レコード間でシャード・キーを共有すると、1つのアトミック操作で複数の表の行を削除することや、1つのアトミック操作で表の行のサブセットを取得することができます。シャード・キーを適切に設計すると、スケーラビリティが実現されるのみでなく、単一のシャードに対するデータの配置またはデータの取得に必要なサイクル数が減ることで、パフォーマンスを改善できます。

NoSQL表階層は、データの正規化を必要とするが、大規模に予測可能な低レイテンシも必要なアプリケーションにとって、理想的なデータ・モデルです。階層は、異なる表をリンクして左外部結合を有効にし、2つ以上の表の行をそれらの間の関連列に基づいて結合します。親子表の行が同じシャードに配置されるため、このような結合は効率的に実行されます。また、階層の各表に存在するレコードは同じシャード・キーを共有するため、表階層内の複数の表への書込みは、トランザクションACIDプロパティに従います。すべての書込み操作は、単一のアトミックな単位として実行されます。そのため、すべての書込み操作が正常に実行されるか、何も実行されません。

Oracle NoSQL Databaseでの親子表の使用

Oracle NoSQL Databaseでは、表を親子関係にすることができます。これを表階層といいます。

多くのNoSQLデータベースは、配列やマップなどのデータ型をサポートしています。データ関係をモデル化するとき、アプリケーション開発者が、各親行がその子行を、配列内か、ネストされた構造内のマップに格納するようにすると簡単になる考える場合があります。このようにすると、データ関係が非正規化されるのみでなく、親行が大きくなる可能性があり、特に、階層が複雑にネストされている場合は、記憶域が非効率になってパフォーマンスが低下します。Oracle NoSQL Databaseの表階層は、配列およびマップに関連する問題を回避するための理想的なデータ・モデルです。埋込み配列ではなく子表を使用する最大の利点の1つは、書込み操作が高速なワークロードの場合にもたらされます。埋込み配列を使用すると、書込み操作は更新されますが、子表としてモデル化されている場合、これらの操作は挿入になります。ログ構造化された追加専用の記憶域アーキテクチャへの挿入は、更新よりもはるかに適しています。Oracle NoSQL Databaseでデータ関係を構築する場合、表階層の使用を検討する必要があります。

NoSQL表階層は、データの正規化を必要とするが、大規模に予測可能な低レイテンシも必要なアプリケーションにとって、理想的なデータ・モデルです。階層は、異なる表をリンクして左外部結合を有効にし、2つ以上の表の行をそれらの間の関連列に基づいて結合します。親子表の行が同じシャードに配置されるため、このような結合は効率的に実行されます。また、階層の各表に存在するレコードは同じシャード・キーを共有するため、表階層内の複数の表への書込みは、トランザクションACIDプロパティに従います。すべての書込み操作は、単一のアトミックな単位として実行されます。そのため、すべての書込み操作が正常に実行されるか、何も実行されません。

表階層の利点

Oracle NoSQL Database表階層には、次の利点があります。
  • 親子階層にデータを格納する場合の優れた効率性 - 親行と子行が別々のNoSQL表に格納されるため、ネストされた配列またはマップに含めた子が単一の親に伴う場合と比較して、親行のサイズが小さくなります。Oracle NoSQL Databaseの追加専用アーキテクチャの場合、親表または子表に対する書込み操作によって、より小さい行の新しいバージョンが作成され、これらの変更が効率的に格納されます。
  • 読取りおよび書込みワークロードの高いパフォーマンス - 親行と子行は同じローカル・シャードに存在するため、階層内のすべてのレコードについて単一のネットワーク・コールでの読取りまたは書込みが可能となり、書込みおよび読取り操作で高パフォーマンスを実現できます。
  • ファイングレイン認可のための高い柔軟性 - 親表または子表へのアクセス権限は、実行時の条件に基づいて個別に構成でき、きめ細かく柔軟な認可を提供します。
  • スケーラブルなACIDトランザクション - 親データと子データを同じシャードに配置することで、スケーラビリティ、低レイテンシおよびACIDの目標を一意に調整します。
  • 表結合 - ネストされた表句または左外部結合を使用して、データを問い合せることができます。
親子表の特性:
  • 子表は、親表の主キー列を継承します。
  • 階層内のすべての表には同じシャード・キー列があり、これらはルート表のCREATE TABLE文に指定されています。
  • 子が削除される前に親表を削除することはできません。
  • 参照整合性制約は、親子表では適用されません。

NoSQL表階層は、データ・エンティティ間の関係を取得するのみでなく、親子行のコロケーションを利用して、高パフォーマンスの取得と優れたスケーラビリティを提供します。表階層を使用すると、アプリケーションでACIDトランザクションを実装できます。同じ親子行のすべてのデータは同じシャードに格納され、原子性、一貫性、分離、永続性を確保するために単一のデータベース操作としてコミットできます。