70

インターネットでいくつかの論文やドキュメントを読んで、Cassandra データ モデルに関する多くの矛盾した情報を見つけました。それを列指向のデータベースとして識別し、他の人は行指向として識別し、両方のハイブリッドな方法として定義する人がたくさんいます。

Cassandraがファイルを保存する方法について私が知っていることによると、*-Index.dbファイルを使用して*-Data.dbファイルの正しい位置にアクセスし、そこにブルームフィルター、列インデックス、そして列を保存します必要な行。

私の意見では、これは厳密に行指向です。足りないものはありますか?

4

7 に答える 7

67

はい、「列指向」の用語は少し紛らわしいです。

Cassandraのモデルは、行に列が含まれていることです。データの最小単位(列)にアクセスするには、最初に行名(キー)を指定し、次に列名を指定する必要があります。

したがって、と呼ばれる列ファミリーではFruit、次の例(2行)のような構造を持つことができます。ここで、フルーツタイプは行キーであり、列にはそれぞれ名前と値があります。

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

orange -> colour    weight  price  origin
          "orange"  120     50     "Spain"

テーブルベースのリレーショナルデータベースとの違いの1つは、いつでも列を省略したり(オレンジには種類がない)、任意の列を追加したり(オレンジには起源がある)できることです。多くの値が空である可能性があるスパースなデータではありますが、上記のデータはテーブルとして想像できます。

ただし、「列指向」モデルは、リストや時系列にも使用できます。この場合、すべての列名が一意になります(ここでは、行は1つだけですが、数千または数百万の列が存在する可能性があります)。

temperature ->  2012-09-01  2012-09-02  2012-09-03 ...
                40          41          39         ...

rowsこれは、時系列のエントリをではなくモデル化する必要があるリレーショナルモデルとはまったく異なりますcolumns。このタイプの使用法は、「ワイド行」と呼ばれることがよくあります。

于 2012-10-22T21:28:12.147 に答える
12

あなたは両方とも良い点を指摘しており、混乱を招く可能性があります. 例では

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

apple はキー値で、列は 4 つのデータ項目すべてを含むデータです。説明によると、4 つのデータ項目すべてが 1 つのオブジェクトとしてまとめて格納され、アプリケーションによって解析されて、必要な値だけが取得されるようです。したがって、IO の観点からは、オブジェクト全体を読み取る必要があります。IMHOこれは本質的に列ベースではなく行(またはオブジェクト)ベースです。

列ベースのストレージは、完全なテーブル スキャン (DW) の極端な圧縮と IO の削減を提供するため、ウェアハウジングで一般的に使用されるようになりましたが、すべての列をプルする必要がある場合に OLTP の IO が増加するという犠牲が伴います (* を選択)。ほとんどのクエリはすべての列を必要とするわけではありません。また、圧縮により、わずか数列の完全なテーブル スキャンで IO を大幅に削減できます。例を挙げましょう

apple -> colour  weight  price variety
         "red"   100     40    "Cox"

grape -> colour  weight  price variety
         "red"   100     40    "Cox"

2 つの異なる果物がありますが、どちらも色 = 赤です。色を重量、価格、種類とは別のディスク ページ (ブロック) に保存し、保存されるのは色だけである場合、ページを圧縮すると、多くの重複排除により極端な圧縮を実現できます。1 ページに 100 行 (仮定上) を格納する代わりに、10,000 色を格納できます。すべてを赤色で読み取ると、何千もの IO ではなく 1 つの IO になる可能性があります。これは、ウェアハウジングと分析には非常に適していますが、行全体を更新する必要がある場合は OLTP には適していません。更新 (または挿入) には数百の IO が必要になる可能性があります。

何かが欠けていない限り、これを柱状ベースとは呼びませんが、オブジェクト ベースと呼びます。オブジェクトがディスク上でどのように配置されているかはまだ明らかではありません。複数のオブジェクトが同じディスク ページに配置されていますか? 同じメタデータを持つオブジェクトを確実に組み合わせる方法はありますか? オブジェクト自体に保存するメタデータや xml など、ある果物に別の果物とは異なるデータが含まれる場合、特定の一致する果物の種類を一緒に保存して効率を高める方法はありますか?

ラリー

于 2013-07-24T15:09:21.623 に答える
3

Cassandra には、もともと BigTable に由来する列ファミリー (テーブル) の概念があります。ただし、あなたが言及したように、それらを列指向と呼ぶのは本当に誤解を招きます。各列ファミリ内で、行のすべての列を行キーと共に一緒に格納し、列圧縮を使用しません。したがって、Bigtable モデルは依然としてほとんどが行指向です。

于 2020-09-12T06:00:15.727 に答える