22

数日前、私は NoSQL のワイドカラム ストアド タイプと Apache-Cassandra のみについて読みました。

私が理解しているのは、Cassandra が次のもので構成されているということです。

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

Stackoverflow タグから:

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

Cassandra では、(テーブル内の) すべての行に行キーが必要であり、各行キーには複数の列を含めることができます。リレーショナル データベースと NoSQL (Cassandra) の実装とデータの格納の違いについて読みました。

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

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

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

select * from users;

ご覧のとおり、結果が得られます。

lastname  | age  | city          | email               
----------+------+---------------+----------------------
      Doe |   36 | Beverly Hills | janedoe@email.com       
    Jones |   35 |        Austin | bob@example.com        
    Byrne |   24 |     San Diego | robbyrne@email.com         
    Smith |   46 |    Sacramento | null                    
   Jones2 | null |        Austin | bob@example.com       

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

select * from [users] 

結果は次のとおりです。

lastname  | age  | city          | email               
----------+------+---------------+----------------------
      Doe |   36 | Beverly Hills | janedoe@email.com       
    Jones |   35 |        Austin | bob@example.com        
    Byrne |   24 |     San Diego | robbyrne@email.com         
    Smith |   46 |    Sacramento | NULL                    
   Jones2 | NULL |        Austin | bob@example.com       

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

ALTER TABLE users ADD website varchar;

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

ALTER TABLE users ADD website varchar(MAX);

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

だから私の質問は:

  1. カサンドラについての私の想像に誤解はありますか?!

  2. では、2つの構造の違いは何ですか?! 結果が同じであることを示します。

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

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

4

2 に答える 2

15

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

はじめに:

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

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

「ワイド行」という用語は、主に Thrift API に関連していました。cql では少し異なって定義されていますが、下は同じように見えます。

SQL と CQL の比較。SQL テーブルでは、行のセットです。簡単な例では、CQL では同じように見えますが、そうではありません。CQL テーブルはパーティションのセットであり、各パーティションは単一の行 (クラスタリング キーがない場合など) または複数の行にすることができます。複数の行を含むパーティションは、"wide-row" という名前の倹約用語で使用されます。それがどのように下に格納されているかを確認するには、ここから複合キーに関する部分などを読んでください。

さらに違いがあります:

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

もう少しわかりやすくしていただければ幸いです。Cassandraの確実な紹介として、 Datastax Core Concepts Courseのビデオを見る(またはスライドを読む)ことをお勧めします。

于 2016-03-24T22:11:31.750 に答える
6

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

SELECT * FROM a_table_here; 

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

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

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

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

ユース ケースの Cassandra の単純化された高レベル ビューでは、順序付けされた Multimap への Map としてデータを格納します。

Doe -> 36:Beverly Hills -> janedoe@email.com

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

例を簡単にするために省略した厄介な点がたくさんあります。詳細については、http ://www.planetcassandra.org/making-the-change-from-thrift-to-cql を読むことを強くお勧めします。 /

于 2016-03-28T05:42:39.193 に答える