web-dev-qa-db-ja.com

Cassandra構造とリレーショナルデータベースの比較

数日前、私はNoSqlのワイドカラムストアタイプとApache-Cassandraだけについて読みました。私が理解しているのは、Cassandraは:で構成されているということです。

キースペース(リレーショナルデータベースのデータベースのような)と多くの列ファミリーまたはテーブル(リレーショナルデータベースのテーブルと同じ)および無制限の行をサポートします。

Stackoverflowタグから:

ワイド列ストアは、Key-Valueデータベースの一種です。テーブル、行、および列を使用しますが、リレーショナルデータベースとは異なり、列の名前と形式は同じテーブル内の行ごとに異なる場合があります。

In Cassandra(テーブル内の)すべての行に行キーが必要な場合、各行キーに複数の列を含めることができます。リレーショナルデータベースとNoSql(Cassandra)の実装とデータの保存の違いについて読みました。 )。

しかし、私は構造の違いを理解していません:

テーブル(またはCassandraの列ファミリー)があるシナリオを想像してみてください:

このようなクエリ(Cql)を実行すると:

Select * from users;

あなたが見ることができるようにそれは私に結果を与えます:

lastname | age  | city          | email               
----------+------+---------------+----------------------
      Doe |   36 | Beverly Hills |   [email protected]       
    Jones |   35 |        Austin |     [email protected]        
    Byrne |   24 |     San Diego |  [email protected]         
    Smith |   46 |    Sacramento |   null                      
  Jones2  | null |        Austin |     [email protected]       

したがって、上記のシナリオをリレーショナルデータベース(MsSql)でblowクエリを使用して実行します。

select * from [users] 

そして結果は:

lastname    age      city              email                    
    Doe     36       Beverly Hills     [email protected]          
    Jones   35       Austin            [email protected]             
    Byrne   24       San Diego         [email protected]         
    Smith   46       Sacramento        NULL                 
   Jones2   NULL     Austin            [email protected]              

Cassandraは動的列をサポートしていることを知っています。これは、次のようなsthを使用して実行できます。

ALTER TABLE users ADD website varchar;

ただし、リレーショナルモデルで使用できます。たとえば、mssqlでは、上記のコードも実装できます。 Sth like:

ALTER TABLE users 
ADD website varchar(MAX) 

私が見ているのは、最初の選択と2番目の選択の結果が同じであるということです。 Cassandraでは、行キー(姓)をスタンドアロンオブジェクトとして提供するだけですが、mssql(およびすべてのリレーショナルデータベース)とIの一意のフィールド(IDやテキストなど)と同じです。 Stackoverflowタグで説明されているものとは異なり、Cassandraは静的です(私の例ではvarchar))の列のタイプを参照してください。

だから私の質問は:

  1. Cassandraについての私の想像に何か誤解はありますか?!

  2. では、2つの構造の違いは何ですか?!結果は同じです。

  3. リレーショナルデータベースに実装できない特別なシナリオ(Jsonのような)はありますが、Cassandraはサポートしていますか?(たとえば、ネストされた列はCassandraではサポートされていないことを知っています。)

読んでくれてありがとう。

違いを確認するには、より複雑な例を見る必要があります:)

はじめに:

  • 列ファミリーの用語は、古いThriftAPIで使用されていました
  • 新しいCQLAPIでは、テーブルという用語が使用されます

テーブルは、「多次元列ファミリーの2次元ビュー」として定義されます。

「ワイドロー」という用語は、主にThriftAPIに関連していました。 cqlでは、定義が少し異なりますが、下は同じように見えます。

SQLとCQLの比較。 SQLテーブルには、行のセットがあります。簡単な例では、CQLでは同じように見えますが、そうではありません。 CQLテーブルはパーティションのセットであり、各パーティションは単一の行(クラスタリングキーがない場合など)または複数の行にすることができます。複数の行を含むパーティションは、「ワイド行」という名前のThrift熱学にあります。下にどのように保存されているかを確認するには、たとえば、 ここ からの複合キーに関する部分。

さらに違いがあります:

  • CQLには、パーティションレベルに格納される静的列を含めることができます。パーティション内のすべての行に共通の値があるように見えますが、実際には、上位レベルに格納される単一の値です。 1:N関係のモデル化にも使用できます
  • CQLでは、コレクションタイプの列(セット、リスト、マップ)を持つことができます
  • 列にはユーザー定義型を含めることができます(たとえば、addressを型として定義し、この型を多くの場所で再利用できます)、またはコレクションはユーザー定義型のコレクションにすることができます
  • ただし、CQLはSQLで使用可能なJOINをサポートしていません。また、テーブルは厳密にクエリ指向である必要があるため、テーブルを慎重に構成する必要があります(cassandraでは、データをクエリできません)任意の列値、セカンダリインデックスにも多くの制限があります)。通常、リレーショナルモデルでは、データに基づいてテーブルをモデル化すると言われます。cassandraの場合、クエリに基づいてモデル化します。

私はあなたのためにそれをもう少し明確にすることができたと思います。 Cassandraの確かな紹介として、 Datastax Core Conceptsコース からいくつかのビデオを見る(またはスライドを読む)ことをお勧めします。

11
mmatloka

私の経験では、CQLは多くの人を誤解させます。まず第一に、あなたは決してやりたくないでしょう:

_SELECT * FROM a_table_here; 
_

本番環境Cassandraクラスターでは、他のすべてのノードからのすべてのデータを集約するためにCoordinatorノードに大きな負荷をかけているためです。また、デフォルトでは、最大値が返されます。 10000「行」の。

Cassandraがデータを格納する方法を理解するには、最初にいくつかの用語を確立する必要があります。

主キーがあります。あなたの場合はlastnameです。これはハッシュされて、クラスター内のどのノードがこの範囲を所有しているかを判別し、そこ(およびレプリカノード)に格納されます。

次にクラスター列があります。例にあるかどうかはわかりませんが、PRIMARY KEY ((lastname),age, city)のように定義します。その例では、最初に年齢、次に都市でクラスタリングしています。これはORDEREDです。

ここで、ユースケースのCassandraの単純な高レベルのビューの場合、データを順序付けられたマルチマップへのマップとして格納します。

_Doe -> 36:Beverly Hills -> [email protected]_

ここで、「Doe」は主キーであり、どのノードがそのデータ行を持っているかを示します。また、_36:Beverly Hills_は順序付きクラスタリングキー(順序付きマルチマップキーの一部)です。最後に、janedoe @ email.comは、Map to a Multimapの最終的な値です(複数の場合もあります)。

例を単純にするために省略した多くの厄介な問題があります。より詳細に読むことを強くお勧めします: http://www.planetcassandra.org/making-the-change-from-thrift -to-cql /

4
fromanator