私は数億のレコードを持つ大規模なテーブルを持っています。このテーブルには、何百万というレコードに対して同じ値が繰り返されるフィールドを追加することを意味します。キャサンドラでこれを効率的にモデル化する方法はわかりません。私は手の込んだことを許可:cassandraの多くのレコードの繰り返し情報をモデル化する方法
私は、一般的なテーブルを持っている:
CREATE TABLE readings (
key int,
key2 int,
time timestamp,
name text,
PRIMARY KEY ((key, key2) time)
)
この表は700.000.000+レコードを持っています。 source
という名前のこのテーブルにフィールドを作成したいとします。このフィールドは、レコードがどこから入手されたかを示します(ソフトウェアには、reading
テーブルの情報を受信する多くの方法があるため)。このフィールドの可能な値の1つは"XML: path\to\file.xml"
または"Direct import from the X database"
、さらには"Manually added"
です。私はこのフィールドを説明的なフィールドにして、後で特定のソースからのレコードのみを操作するデータベースのメンテナンスを可能にするために使用します。
私は私が今していることができないことを実行したいクエリ:readings
テーブルに記録し
- が与えられたソースから得たのですか?
- 特定のレコードのソースは何ですか?私が最初にクエリを実行できるようにするだろうが、また、私は700.000.000+新しいレコードを作成することを意味します
CREATE TABLE readings_per_source( source text, key int, key2 int, time timestamp, PRIMARY KEY (source, key, key2, time) )
:私のような表を作成するためのソリューションは以下のようになり
多くの情報を持つ私のデータベースでは、これらのレコードの何千万もがsource
の同じ値を持つので、不必要な記憶領域が多くなります。
これは、リレーショナル環境だった場合、私は唯一のreadings
テーブル上の行ごとに、追加の整数と新しいテーブルを保存する意味であろうと、readings
テーブルとid (PK)
とname
フィールドを持つsource
テーブルの上にsource_id
フィールドを作成しますがさまざまな情報源と同じ数の記録がありました。
キャサンドラでこれをどのようにモデリングするのですか?
はい、私はクエリが多くのレコードを返す可能性があることを知っています、そして、目的のようです。問題になることはありますか?私は、単一のクエリで何百万ものレコードを返すことを意味します。また、私はある種のインデックスを作成することを考えていましたが、それを行う方法がわからなかったので、あなたの答えは大いに役立ちます。 1つの質問が残っています。単純に列を追加し、値を正規化されていない方法で繰り返すだけで、ストレージの過度の使用が発生しませんか? –
また、私はpythonドライバを使用しています。ドライバが既に大きなクエリの結果を表示していることがわかりました。すでに行っていることとは異なる設定が必要ですか? –
"しかし、1つの質問が残っています。列を追加して値を正規化されていない方法で繰り返すだけで、ストレージの過度の使用は発生しませんか?理論的には、実際には(デフォルトで)ディスク圧縮を有効にしておくと、スペースを節約するのに役立ちます。 – doanduyhai