2017-02-15 3 views
0

私はCassandraで非常に大きなmysqlテーブルを採用するための最良のデータモデルを見つけようとしています。 このテーブルは、このように構成されています(ここではない)Cassandra、大きなテーブルを動的にフィルタリングして更新する方法は?

CREATE TABLE big_table (
    social_id, 
    remote_id, 
    timestamp, 
    visibility, 
    type, 
    title, 
    description, 
    other_field, 
    other_field, 
    ... 
) 

ページには、多くのremote_idsを含めることができ、多くの社交を含めることができます。

Social_idはパーティション化キーです。remote_idとtimestampはクラスタリングキーです。「Remote_id」はユニティシティを示し、「Time」は結果の順序を示します。ここまでは順調ですね。

問題は、ユーザーが1つまたは複数のソーシャル、1つ以上のタイプ、可視性(0,1,2であってもよい)、日付の範囲、またはまったく何もフィルタリングすることなくページコンテンツを検索できることです。 さらに、フィルタに基づいて、ユーザーは可視性を設定できる必要があります。

私はこのケースを処理しようとしましたが、私は本当に持続可能な解決策を見つけることができます。 私が持っている最高のものは、元のテーブルに追いつくために必要な別のテーブルを作成することです。 このテーブルには、必要があります:

  • page_idの:狂気である、フィルタの組み合わせごとにマテリアライズド・ビューを作成し、キー

プラスをクラスタリング:キー

  • タイムスタンプ、social_id、タイプ、remote_idを分割します。

    2番目のテーブルを作成しないでください。この場合、最高のカッサンドラモデルは何でしょうか?他のテクノロジーに切り替えることを検討する必要がありますか?

  • 答えて

    0

    最後の質問から始めます。

    >このケースでは、カサンドラのベストモデルは何ですか?(私は非常に選択するか、カサンドラを使用する前に読むことをお勧めします)Cassandra: The Definitive Guide, 2nd editionで述べたように

    、あなたはデータモデルで始まらないカサンドラで

    クエリモデルで始まります。

    Safaribooksonline.comでデータデザインに関する章を読むことができます。基本的に、Cassandraはクエリについてのみ考え、正規化については気にしません。

    上だから、答えは>私は2番目のテーブルを作成しないようにすることはできますか?

    です。これは避けてください。

    >他のテクノロジーに切り替えることを検討する必要がありますか?

    これは、レプリケーションとパーティショニングの面で必要なものによって異なります。 RDBMSなどに基づいてマスタとマスターの同期を作成することになります。カサンドラでは、テーブル間でデータが重複してしまうことになりますが、それは完全に正常です。読み書き速度と引き換えにディスクスペースを交換します。

    >大きなテーブルを動的にフィルタリングして更新するにはどうすればよいですか?

    もしあなたがまだカサンドラに正規化されたデータモデルを使用する上記のすべての後、私はあなたが最初にsecondary indexesに見て、その後、Lucene indexなどのカスタムインデックスに移動示唆しています。

    +0

    コンテンツを複製するのに、私が述べた問題(複数の動的フィルタ)を使ってテーブルをモデル化するにはどうすればよいですか?フィルタの組み合わせごとにテーブルを作成しますか?またはテーブルと多数のマテリアライズドビュー?このケースを扱う最良のモデルは何ですか? –

    +0

    Cassandra:TDGの書籍の例では、ユーザーが使用するクエリを事前定義することを提案しています(book: 'hotel'を' name'または 'free_rooms count'で検索する例)。どのようなクエリでも事前定義されていないものは、SELECT *;を使用して、アプリケーション側でこれを処理するか、セカンダリインデックスを使用する必要があります。 – doz10us

    +0

    ただし、セカンダリインデックスは一意の値を持つ列(インデックスは列に等しい)といくつかの異なる値を持つ列(たとえば、「性別」列)に対しては推奨されません。 – doz10us

    関連する問題