列指向のNoSQLはドキュメント指向とどう違うのですか?


89

私が読んだNoSQLデータベースの3つのタイプは、キー値、列指向、およびドキュメント指向です。

Key-Valueは非常に単純です-単純な値を持つキーです。

キー値のように記述されたドキュメント指向データベースを見てきましたが、値はJSONオブジェクトのような構造にすることができます。各「ドキュメント」は、別のキーと同じキーをすべて、一部、またはまったく持つことができません。

列指向は、構造を指定しないという点でドキュメント指向に非常によく似ているようです。

では、これら2つの違いは何ですか。また、なぜ一方を他方の上に使用するのでしょうか。

私は特にMongoDBとCassandraを見てきました。基本的に、変更できるが他の値には影響しない動的構造が必要です。同時に、特定のキーを検索/フィルタリングしてレポートを実行できるようにする必要があります。CAPでは、APが私にとって最も重要です。データの競合や損失がない限り、データは「最終的に」ノード間で同期できます。各ユーザーは、独自の「テーブル」を取得します。

回答:


41

Cassandraでは、各行(キーでアドレス指定される)に1つ以上の「列」が含まれます。列はそれ自体がキーと値のペアです。列名を事前定義する必要はありません。つまり、構造は固定されていません。行の列は、キー(名前)に従ってソートされた順序で格納されます。

場合によっては、行に非常に多数の列がある場合があります(たとえば、特定の種類のクエリを有効にするためのインデックスとして機能するため)。Cassandraはこのような大きな構造を効率的に処理でき、特定の範囲の列を取得できます。

スーパーカラムと呼ばれる構造のレベルがさらにあり(あまり一般的には使用されません)、カラムにはネストされた(サブ)カラムが含まれます。

全体的な構造は、2つまたは3つのレベルのキーを持つネストされたハッシュテーブル/辞書と考えることができます。

通常の列ファミリー:

row
    col  col  col ...
    val  val  val ...

スーパーコラムファミリー:

row
      supercol                      supercol                     ...
          (sub)col  (sub)col  ...       (sub)col  (sub)col  ...
           val       val      ...        val       val      ...

データを分割またはグループ化するために使用できる高レベルの構造(列ファミリーとキースペース)もあります。

この質問も参照してください:Cassandra:サブカラムとは何ですか

または、http: //wiki.apache.org/cassandra/ArticlesAndPresentationsからのデータモデリングリンク

Re:ドキュメント指向データベースとの比較-後者は通常、ドキュメント全体(通常はJSON)を挿入しますが、Cassandraでは、個々の列またはスーパー列をアドレス指定し、これらを個別に更新できます。つまり、異なるレベルの粒度で機能します。各列には、独自のタイムスタンプ/バージョンがあります(分散クラスター全体で更新を調整するために使用されます)。

Cassandra列の値は単なるバイトですが、ASCII、UTF8テキスト、数値、日付などとして入力できます。

もちろん、JSONを含む列を挿入することで、Cassandraをプリミティブドキュメントストアとして使用できますが、実際のドキュメント指向ストアのすべての機能を利用できるわけではありません。


5
列ファミリーはテーブルのようなものです。行はテーブル行のようなものです。列は、オンザフライで定義できることを除けば、データベース列に似ています。そのため、場合によってはテーブルの数が非常に少ない場合や、各行に異なる列が入力されている場合があります。
DNA

1
データベースによって異なります。MongoDB(ドキュメント指向)では、すべてのキーを更新することもできます。
David Raab 2011

1
それが本当なら、Cassandraが列指向であるのに対し、MongoDBはドキュメント指向データベースをどのように定義していますか。それらはどう違いますか?
ルーク

3
@Luke列指向は、スキーマのないRDBMSに非常によく似ていますが、構造が緩いことに加えて、主な違いは、リレーショナルではないことです。
user327961 2011

1
@ user327961しかし、MongoDBもスキーマレスRDBMSのようなものであり、リレーショナルでもありません。
huggie 2014

54

主な違いは、ドキュメントストア(MongoDBやCouchDBなど)では任意に複雑なドキュメント(サブドキュメント内のサブドキュメント、ドキュメントを含むリストなど)が許可されるのに対し、列ストア(CassandraやHBaseなど)では固定形式(厳密な1レベルや2レベルの辞書。


この場合、mongo(document)はcassendra(Column)が実行できることを実行できます。では、なぜ列が必要なのですか?
sanjay patel

1
これは、さまざまな機能間のトレードオフです。列指向の設計では、ストレージエンジンは、ドキュメント指向のストレージエンジンよりもはるかに効率的です。MongoDBは、ドキュメントが大きくなった場合、ドキュメント全体をディスクに書き直す必要がありますが、Cassandraは書き直す必要はありません(これは単純化です。もちろん、これには多くの詳細があります)。これにより、Cassandraは書き込みに関してはるかに高速になります。
テオ

29

「挿入」では、rdbmsワードを使用するために、ドキュメントベースの方が一貫性があり、まっすぐ進んでいます。cassandraを使用すると、クォーラムの概念との一貫性を実現できますが、これはすべての列ベースのシステムに適用されるわけではなく、可用性が低下することに注意してください。ライトワンス/リードが多いシステムでは、MongoDBを使用します。また、オブジェクトの構造全体を常に読み取ることを計画している場合も考慮してください。ドキュメントベースのシステムは、ドキュメントを取得したときにドキュメント全体を返すように設計されており、行全体の一部を返すことはあまり得意ではありません。

Cassandraのような列ベースのシステムは、「更新」においてドキュメントベースよりもはるかに優れています。列を含む行を読み取らなくても、列の値を変更できます。書き込みは実際には同じサーバーで実行する必要はありません。複数のサーバーの複数のファイルに行が含まれている場合があります。急速に進化する巨大なデータシステムでは、Cassandraを選択してください。また、キーごとに非常に大きなデータチャンクを計画していて、クエリごとにすべてをロードする必要がない場合にも検討してください。「選択」では、Cassandraで必要な列のみをロードできます。

また、MongoDBはC ++で記述されており、2番目のメジャーリリースであり、CassandraはJVMで実行する必要があり、最初のメジャーリリースは昨日からのみリリース候補になっていることを考慮してください(ただし、0.Xリリースはすでに大手企業)。

一方、Cassandraの設計は部分的にAmazon Dynamoに基づいており、高可用性ソリューションとしてコアで構築されていますが、それは列ベースの形式とは何の関係もありません。MongoDBもスケールアウトしますが、Cassandraほど優雅ではありません。


1
C ++とJavaで書かれているソフトウェアの何が問題になっていますか?
ナユキ2018

@Nayukiさて、Javaのメモリ管理モデルのレイジーガベージコレクションが理論的にはC ++の「手動」管理モデルよりも優れている、競合の多いワークロードがあることを認識していますが、一般的に言って、同等のものを記述してJavaよりも優れていることは通常難しくありません。少なくとも例外とRTTIを無効にしている限り、C ++でプログラムします。そして、スタックレスコルーチンと再開可能な関数をうまく利用すれば、私は個人的にJavaが私のC ++を打ち負かすのを見たことがありません。
patrickjp 9319年

0

主な違いは、これらの各DBタイプがデータを物理的に格納する方法です。
列タイプでは、データは列ごとに格納されるため、特定の列で効率的な集計操作/クエリを実行できます。
ドキュメントタイプでは、ドキュメント全体が論理的に1つの場所に保存され、通常は全体として取得されます(「列」/「フィールド」で効率的な集計はできません)。

紛らわしい点は、幅の広い「行」をドキュメントとして簡単に表現できることですが、前述のように、それらは異なる方法で格納され、異なる目的に合わせて最適化されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.