NoSQL(元々は「Not only SQL」または「non-relational」の意味)[ 1]は、従来のテーブルベースのリレーショナルデータベースの構造とは異なる方法でデータを保存および取得するデータベース設計の一種を指します。スプレッドシートのようにデータを行と列に整理するリレーショナルデータベースとは異なり、NoSQLデータベースは、キーと値のペア、幅の広い列、グラフ、ドキュメントなどの単一のデータ構造を使用して情報を保持します。この非リレーショナル設計は固定スキーマを必要としないため、大規模で非構造化されていることが多いデータセットを管理するために簡単に拡張できます。[2] NoSQLシステムは、 SQLのようなクエリ言語をサポートしたり、複数のデータベースタイプが組み合わされたポリグロットパーシステントセットアップでSQLデータベースと連携したりできるため、 「Not only SQL」と呼ばれることもあります[3] [4]非リレーショナルデータベースの歴史は1960年代後半に遡りますが、「NoSQL」という用語はソーシャルメディアプラットフォームなどのWeb 2.0企業のニーズに後押しされて2000年代初頭に登場しました。 [5] [6]
NoSQLデータベースは、そのシンプルな設計、マシンのクラスタにわたるスケーリング機能(水平スケーリングと呼ばれる)、およびデータ可用性の正確な制御により、ビッグデータおよびリアルタイムWebアプリケーションで人気がある。[7] [8]これらの構造は特定のタスクを高速化することができ、多くの場合、固定データベーステーブルよりも適応性が高いと見なされる。[9]しかし、多くのNoSQLシステムでは、厳密な一貫性(CAP定理による)よりも速度と可用性を優先し、結果整合性を使用している。結果整合性とは、更新が最終的にすべてのノードに到達し、通常は数ミリ秒以内であるが、最新データへのアクセスに短い遅延(古い読み取りと呼ばれる)が発生する可能性があるシステムのことである。[10]ほとんどのシステムでは完全なACIDトランザクションサポートが欠如しているが、MongoDBのようにそれを主要機能として含んでいるシステムもある。[11]
NoSQLの普及を阻む障壁としては、SQLではなく低レベルのクエリ言語を使用していること、テーブル間でアドホック結合を実行できないこと、標準化されたインターフェースが不足していること、リレーショナルデータベースへの多大な投資などが挙げられます。[12]一部のNoSQLシステムでは、書き込みの損失やその他の形でデータが失われるリスクがありますが、先行書き込みログ(変更を適用する前に記録する方法)などの機能は、これを防ぐのに役立ちます。[13] [14]複数のデータベースにまたがる分散トランザクション処理では、データの一貫性を維持することがNoSQLとリレーショナルシステムの両方にとって課題となります。リレーショナルデータベースは個別のデータベースをリンクするルールを適用できず、分散更新を管理するためのACIDトランザクションとX/Open XA標準の両方をサポートするシステムはほとんどないためです。[15] [16]インターフェース環境内の制限は、セマンティック仮想化プロトコルを使用することで克服され、NoSQLサービスはほとんどのオペレーティングシステムからアクセス可能になります。[17]

NoSQLという用語は、1998年にカルロ・ストロッツィによって、標準的な構造化照会言語(SQL)インターフェースを公開していないものの、リレーショナルデータベースである軽量オープンソースリレーショナルデータベース「ストロッツィNoSQL」の名称として用いられました。 [18]彼のNoSQL RDBMSは、2009年頃のNoSQLデータベースの一般的な概念とは異なります。ストロッツィは、現在のNoSQLの動きは「リレーショナルモデルから完全に逸脱しているため、『NoREL』と呼ぶ方が適切だった」と示唆しています。 [19]これは「リレーショナルではない」という意味です。
当時Last.fmの開発者だったヨハン・オスカーソンは、2009年初頭に「オープンソースの分散型非リレーショナルデータベース」について議論するイベントを開催し、NoSQLという用語を再導入しました。[20]この名前は、GoogleのBigtable / MapReduceやAmazonのDynamoDBのオープンソースクローンを含む、非リレーショナル分散型データストアの増加を示すために使用されました。
NoSQLデータベースを分類する方法は様々で、異なるカテゴリとサブカテゴリがあり、一部は重複しています。以下は、データモデルによる網羅的ではない分類と例です。[21]
キーバリュー(KV)ストアは、連想配列(マップまたは辞書とも呼ばれる)を基本的なデータモデルとして用います。このモデルでは、データはキーと値のペアのコレクションとして表現され、各キーはコレクション内で最大1回しか出現しません。[24] [25]
キーバリューモデルは最も単純で非自明なデータモデルの一つであり、より高度なデータモデルはしばしばその拡張として実装されます。キーバリューモデルは、キーを辞書式順序で維持する離散順序モデルに拡張できます。この拡張は計算力が非常に高く、選択的なキー範囲を効率的に取得できます。[26]
キーバリューストアは、結果整合性からシリアル化可能性まで、幅広い一貫性モデルを使用できます。一部のデータベースはキーの順序付けをサポートしています。ハードウェア実装には様々な種類があり、データをメモリ(RAM)に保存するユーザーもいれば、ソリッドステートドライブ(SSD)や回転式ディスク(ハードディスクドライブ(HDD)とも呼ばれます)に保存するユーザーもいます。
ドキュメントストアの中心的な概念は「ドキュメント」です。この定義の詳細はドキュメント指向データベースによって異なりますが、いずれの場合も、ドキュメントはデータ(または情報)を何らかの標準形式またはエンコーディングでカプセル化し、エンコードすることを前提としています。使用されるエンコーディングには、XML、YAML、JSON、そしてBSONのようなバイナリ形式が含まれます。ドキュメントは、データベース内でそのドキュメントを表す一意のキーによってアドレス指定されます。ドキュメント指向データベースのもう一つの特徴は、ドキュメントの内容に基づいてドキュメントを取得するためのAPIまたはクエリ言語を備えていることです。
実装によって、ドキュメントを整理およびグループ化する方法が異なります。
リレーショナルデータベースと比較すると、コレクションはテーブル、ドキュメントはレコードに類似していると考えることができます。しかし、両者は異なります。テーブル内のすべてのレコードは同じフィールドの順序を持ちますが、コレクション内のドキュメントは全く異なるフィールドを持つ場合があります。
グラフデータベースは、有限数の関係で接続された要素からなるグラフとして、関係が適切に表現されるデータのために設計されています。データの例としては、社会関係、公共交通機関のリンク、道路地図、ネットワークトポロジなど が挙げられます。
NoSQLデータベースのパフォーマンスは通常、 1秒あたりの操作数で測定されるスループットという指標を使用して評価されます。パフォーマンス評価では、本番環境の構成、データベースのパラメータ、予想されるデータ量、同時ユーザーワークロードなど の適切なベンチマークに注意を払う必要があります
ベン・スコフィールドは、NoSQLデータベースのさまざまなカテゴリを次のように評価しました。[28]
パフォーマンスとスケーラビリティの比較は、YCSBベンチマーク を使用して最も一般的に行われます
ほとんどのNoSQLデータベースはクエリ内での結合機能がないため、データベーススキーマは通常、異なる方法で設計する必要があります。NoSQLデータベースでリレーショナルデータを処理するための主な手法は3つあります。(結合をサポートするNoSQLデータベースについては、テーブル結合とACIDサポートを参照してください。)
1つのクエリですべてのデータを取得するのではなく、目的のデータを取得するために複数のクエリを実行するのが一般的です。NoSQLクエリは従来のSQLクエリよりも高速であることが多いため、追加のクエリにかかるコストは許容範囲内です。過剰な数のクエリが必要な場合は、他の2つのアプローチのいずれかが適切です
外部キーのみを保存するのではなく、モデルのデータと共に実際の外部値を保存するのが一般的です。例えば、各ブログコメントにはユーザーIDに加えてユーザー名が含まれる場合があり、これにより、別の検索を必要とせずにユーザー名に簡単にアクセスできます。しかし、ユーザー名が変更されると、データベース内の多くの場所でユーザー名を変更する必要があります。したがって、このアプローチは、書き込みよりも読み取りがはるかに多い場合により効果的です。[29]
MongoDBのようなドキュメントデータベースでは、より多くのデータをより少数のコレクションに格納するのが一般的です。たとえば、ブログアプリケーションでは、ブログ投稿ドキュメント内にコメントを保存することで、1回の検索ですべてのコメントを取得できます。したがって、このアプローチでは、特定のタスクに必要なすべてのデータが1つのドキュメントに含まれます
データベースのドキュメントにACID特性(原子性、一貫性、独立性、永続性)または結合操作のサポートが記載されている場合、そのデータベースはACID特性または結合操作をサポートしているとみなされます。ただし、これは必ずしも、ほとんどのSQLデータベースと同様に、その機能が完全にサポートされていることを意味するわけではありません。
DynamoDB、MongoDB、Cassandra、Couchbase 、HBase、Redisなどのさまざまな NoSQL データベースは、インデックスが作成されていないフィールドをクエリするときにさまざまな動作を示します。多くのデータベースでは、このようなクエリに対してテーブル全体のスキャンまたはコレクション スキャンが実行され、データを取得した後にフィルター操作が適用されます。ただし、最新の NoSQL データベースには、クエリ パフォーマンスを最適化するための高度な機能が組み込まれていることがよくあります。たとえば、MongoDB は複合インデックスとクエリ最適化戦略をサポートし、Cassandra はセカンダリ インデックスとマテリアライズド ビューを提供し、Redis は特定のユース ケースに合わせたカスタム インデックス メカニズムを採用しています。Elasticsearch などのシステムでは、効率的なテキストベースの検索に転置インデックスを使用しますが、インデックスが作成されていないフィールドに対してはフル スキャンが必要になることがあります。この動作は、多くの NoSQL システムの設計が、任意のフィールドに対する最適化されたクエリではなく、スケーラビリティと効率的なキーベースの操作に重点を置いていることを反映しています。その結果、これらのデータベースは基本的なCRUD操作とキーベースの検索には優れていますが、結合やインデックスなしのフィルタリングを含む複雑なクエリへの適合性は、データベースの種類(ドキュメント、キーと値、ワイドカラム、グラフ)と特定の実装によって異なります。[33]
NoSQLデータベース、Not Only SQLとも呼ばれる
の支持者の多くは、NoSQLはSQLに「ノー」という意味ではなく、むしろSQLだけではないという意味だと主張している。
キーバリューストアは、アプリケーション開発者がスキーマレスなデータを保存することを可能にします。このデータは通常、キーを表す文字列と、「キーバリュー」関係において値とみなされる実際のデータで構成されます。データ自体は通常、プログラミング言語のプリミティブ型(文字列、整数、配列)か、プログラミング言語のバインディングによってキーバリューストアにマーシャリングされたオブジェクトです。この構造により、固定データモデルの必要性がなくなり、適切なフォーマットが可能になります。
キーバリューストアは、データの保存とアクセスに関して、リレーショナルデータベースシステムに代わる高性能な選択肢を提供します。本稿では、現在利用可能なキーバリューストアのいくつかと、それらのRubyプログラミング言語とのインターフェースについて簡潔に概説します。