数日前、私は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
))の列のタイプを参照してください。
だから私の質問は:
Cassandraについての私の想像に何か誤解はありますか?!
では、2つの構造の違いは何ですか?!結果は同じです。
リレーショナルデータベースに実装できない特別なシナリオ(Jsonのような)はありますが、Cassandraはサポートしていますか?(たとえば、ネストされた列はCassandraではサポートされていないことを知っています。)
読んでくれてありがとう。
違いを確認するには、より複雑な例を見る必要があります:)
はじめに:
テーブルは、「多次元列ファミリーの2次元ビュー」として定義されます。
「ワイドロー」という用語は、主にThriftAPIに関連していました。 cqlでは、定義が少し異なりますが、下は同じように見えます。
SQLとCQLの比較。 SQLテーブルには、行のセットがあります。簡単な例では、CQLでは同じように見えますが、そうではありません。 CQLテーブルはパーティションのセットであり、各パーティションは単一の行(クラスタリングキーがない場合など)または複数の行にすることができます。複数の行を含むパーティションは、「ワイド行」という名前のThrift熱学にあります。下にどのように保存されているかを確認するには、たとえば、 ここ からの複合キーに関する部分。
さらに違いがあります:
address
を型として定義し、この型を多くの場所で再利用できます)、またはコレクションはユーザー定義型のコレクションにすることができます私はあなたのためにそれをもう少し明確にすることができたと思います。 Cassandraの確かな紹介として、 Datastax Core Conceptsコース からいくつかのビデオを見る(またはスライドを読む)ことをお勧めします。
私の経験では、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 /