RocksDBのようなNoSQLデータベースシステムは列ファミリーと呼ばれる機能を提供することを確認しました。概念が何を意味するかは理解していると思いますが、それらを使用することの実際の(実用的な)利点は何ですか?少なくとも場合によっては、ルックアップのパフォーマンスや、キーと値の全体の空間的な局所性を改善できると思いますか?しかし、私が理解している限り、データベースアクセスの実際のセマンティクスには影響しないようです。これは正しいです?何か足りないものはありますか?
RocksDB[〜#〜] faq [〜#〜] からいくつかの興味深い情報を見つけました。 (RocksDBはK-Vストアです。)
ここにいくつかの関連する抜粋があります。
Q:列ファミリーは何に使用されますか?
A:列ファミリーを使用する最も一般的な理由:(1)データのさまざまな部分で、異なる圧縮設定、コンパレーター、圧縮タイプ、マージ演算子、または圧縮フィルターを使用します。 (2)列ファミリーを削除してデータを削除します。 (3)メタデータを格納する1つの列ファミリーとデータを格納する別の列ファミリー。
Q:データを複数の列ファミリーと複数のrocksdbデータベースに格納することの違いは何ですか?
A:主な違いは、バックアップ、アトミックな書き込み、書き込みのパフォーマンスです。複数のデータベースを使用する利点:データベースは、バックアップまたはチェックポイントの単位です。データベースを列ファミリーよりも別のホストにコピーする方が簡単です。複数の列ファミリーを使用する利点:(1)書き込みバッチは、1つのデータベースの複数の列ファミリーにまたがってアトミックです。複数のRocksDBデータベースを使用してこれを実現することはできません。 (2)WALに同期書き込みを発行すると、データベースが多すぎるとパフォーマンスが低下する可能性があります。
Q:キースペースが異なります。それらをプレフィックスで区切るか、別の列ファミリーを使用する必要がありますか?
A:各キースペースがかなり大きい場合は、それらを異なる列ファミリーに配置することをお勧めします。小さい場合は、1つの列ファミリーに複数のキースペースをパックすることを検討してください。あまりにも多くの列ファミリーを維持する手間を省くことができます。
SQLとの並列性を求めているのではないことは知っていますが、この記事では、列ファミリーの目的と実際的な利点について簡単に説明します。
From nderstanding the Cassandra Data Model from a SQL Perspective on RubyScale:
そのときの列ファミリとは何ですか?テーブルのプレフィックスだけですか?柱ファミリには、その動作を変更するさまざまな設定があります。 キーのキャッシュ設定(この例ではUUID)、行全体(この例ではテーブル全体)、最も重要なのはソートのキャッシュ設定があります。 Cassandraでは、OFFSETはなく、LIMITとBETWEENに相当するもののみです。この例では、列名は単なる文字列ですが、整数またはタイムスタンプとそれらは常に並べ替え順序で保存されます。1つの列ファミリにはタイムスライスでクエリを行うタイムスタンプで並べ替えられたデータがあり、別の列ファミリにはアルファベット順にクエリを行うアドレス帳データがある場合があります。事実は、特定のスライスを反転させることです。