MicrosoftはSQL Serverのおかげでリレーショナルデータベースの世界でも一定の地位を占めている。しかし、新しいNoSQL製品がこの状況を変えるかもしれない。Microsoftは先週、DocumentDBを発表した。これは、クラウドにホストされるドキュメント指向データベースであり、JavaScriptをしっかりとサポートし、自動インデックス、トランザクションもサポートする。
DocumentDBはスキーマレスの、SSDを使ったデータベースであり、JSONドキュメントを保持し、REST APIで操作できる。Microsoftによれば、Microsoft Azureだけで使えるこのサービスは新しい領域のニーズを満しつつ、リレーショナルデータベースの便利な概念は放棄していない。
私たちは顧客から、アプリケーションの素早い進化に追いついてくるデータベースが欲しいという声を聞いていました。高速に動作し、柔軟で拡張可能なデータベースです。段階的にですが、NoSQLデータベースは多くの開発者にとって選択肢になりつつあります。しかし、動作させ管理するのはコストがかかります。特に拡張させるときはそうです。また、リレーショナルデータベースに対して、よりキャパシティを求める声も聞いています。リッチなクエリやトランザクション処理も重要です。ほとんどのデータストアは、極端な選択肢を提供します。強力な一貫性、最終的な一貫性の保証、スキーマレスだが制限的なクエリした対処できないもの、または、スキーマはあるがリッチなクエリを処理できるもの、トランザクション、スケーラビリティなどです。無数にある実世界のシナリオはこれらの極端の間にある、というのが真実です。私たちもそういったシナリオに対処したいのです。
ではDocumentDBはどのような点がリレーショナルデータベースに似ているのか。ドキュメントは軽量なSQL構文のクエリを受け付ける。このクエリはオブジェクトや配列などJavaScriptの要素を認識する。多くの人気のNoSQLデータベースが単一の一貫性のあるデータストレージに依存しているのとは違い、DocumentDBは4つの異なるモデルを扱う。
DocumentDBは4つの異なる一貫性のモデルを提供します。Strong、Bounded Staleness、Session、Eventualの4つです。しっかりと定義された一貫性のレベルによって、一貫性と可用性と遅延のトレードオフが実現されます。Bounded Stalenessは全体の書き込み順序と最大限の堅牢さを保証します。順序が重要な役割を果たすアプリケーションを開発するのに有効な一貫性レベルを保証するということです。Sessionは自分自身が書き込んだデータの読み取りを保証します。ユーザ中心のアプリの開発に便利かもしれません。
また、自動インデキシングとトランザクションもリレーショナルデータベースの特性を反映している。インデキシングについては、
ドキュメントをコレクションに追加すると、DocumentDBは自動的にインデックスを設定します。スキーマやセカンダリインデックスを必要としない、ドキュメントに対する自動インデキシングはDocumentDBの中核機能であり、書き込み最適化、ロックフリー、ログ構造化メンテナンス技法によって実現されています。
DocumentDBのインデックスを構成する場合、幅広い選択肢がある。自動インデキシングはデフォルトで有効になっているが、無効にしたり、細かく制御したりもできる。パスやパターンを使って、あるドキュメントをインデキシングから除外したり、インデックスの更新を同期で実行するか非同期で実行するかも設定できる。
また、サーバサイドのビジネスロジックを適用するのにも数多くの選択肢を与える。DocumentDBはユーザ定義関数、ストアドプロシージャ、トリガをサポートする。
JavaScriptとJSONをデータベースのエンジンとして使っているおかげで、DocumentDBは直感的なプログラミングモデルを提供し、ストアドプロシージャやトリガを使ってJavaScriptベースのアプリケーションロジックをコレクションに直接適用できます。これによって、(a)効率的な非同期制御、リカバリ、JSONオブジェクトグラフに対する自動インデキシングが可能になります。また、(b)制御フロー、変数のスコーピング、割当、例外ハンドルプリミティブとデータベーストランザクションの統合も可能になりました。
…
DocumentDBはJavaScriptベースのストアドプロシージャとトリガをコレクション内のドキュメントに股がるスナップショット分離を活用して、暗黙にACIDトランザクションで包みます。実行中にJavaScriptが例外を発生させたら、トランザクション全体が中断されます。
…
DocumentDBはドキュメント間の関連を記述するのに特別なJSONの規約を要求しません。DocumentDBの問い合わせ言語はとても強力な階層型で関係型の問い合わせオペレータを提供します。これを使えば、特別なアノテーションや専用のプロパティを使ってドキュメント間の関連を定義せずに問い合わせができます。
では、このデータベースはどの程度の性能が出るのか。GigaOmによれば、DocumentDBはSQL Server 2014のインメモリエンジンHekatonを使っている。また、MicrosoftのバイスプレジデントScott Guthrie氏によれば、このデータベースは同社の社内ではすでにかなり活用されている。
昨年来、私たちは社内のいくつかの重要なサービスでDocumentDBを使っています。それぞれ、100テラバイトの大きさであり、1日で数百万の複雑な問い合わせを処理しています。遅延はミリ秒単位であり、予測可能な範囲です。
では、Microsoft Azureで利用できる他のNoSQLはどうなってしまうのか。同社はAzure Table Storageというキーバリューストレージをまだ提供している。また、最近、Redisをベースにしたキャッシュサービスの提供を始めた。Microsoft Azure上でのマネージドサービスを追加したMongoDBはどうなるかわからない。あるWindowsベースのNoSQLを提供している企業はDocumentDBを厳しく批判している。RavenDBの開発者であるOren Eini氏はDocumentDBの登場を残念に思っている。氏はにブログに不満を書いている。
- ソートのオプションがない。ページングの優れた方法もない。
- SQLインジェクション。
- デプロイが難しい。コードベースの最新と同期するのが難しい。
- 開発、テスト方法が確立されていない。
- クライアントAPIが貧弱。
- テーブルスキャンが多すぎる。
- 問い合わせが限定的。最適化オプションも少ない。
- 単一のドキュメントトランザクション
- コレクションを股がったトランザクションができない
- ドキュメントサイズが小さすぎる
DocumentDBはまだ“プレビュー”状態だが、Microsoftは.NET、Node.js、JavaScript、Python向けのSDKを提供している。価格は“キャパシティユニット”に基づく。ひとつのキャパシティユニットで使えるリソースは、秒間2000回の読み取り、秒間500回のインサート/リプレイス/削除、そして10GBのストレージだ。プレビューの期間は、ひとつのキャパシティユニットを1日0.73ドルで使える。これは予想される正規の値段の半額だ。DocumentDBは現在、Microsoft AzureのUS West、Europe North、Europe Westで利用できる。