2016-06-20 2 views
0

従来のSQLデータベースの代わりにCassandraを使用する新しいアプリケーションを設計しようとしています。クラスタ化と水平スケーリングの機能は、私の使用事例に特に役立ちます。Cassandraに柔軟なスキーマを保存する

私はお互いにかなり異なる可能性のある複数のレコードがあるこの状況があります。例えば、私が異なるスポーツ情報を保存している場合、サッカーの場合、2チーム、プレーヤー、半分の時間とフルタイムの後の結果、赤いカード、黄色いカードなどのようなものを保存し、テニスの試合の場合は2人の対戦相手のようなもの、セットの数など

私は各スポーツのためのテーブルを持っていません(負荷があります)、毎回データベースを変更することなく新しいスポーツを追加したいと考えています。私は、この情報がレコードのスポーツ種別に応じて任意に変更できる場合には柔軟にしたいと考えています。

カッサンドラでこのような情報をどのようにモデル化するのが最適ですか?私はそれがMongoDBなどのような 'ドキュメント'指向のデータベースではないことを知っていますが、アプリケーションの残りの部分では、Cassandraが提供するテーブルのような構造が理想的です。

テキストフィールドにJSON文字列として保存してアプリケーションレベルで処理することができますが、今後JSON文字列内のフィールドを一括照会する要件が制限されてしまうことが懸念されます。特定の審判員がいた)。

地図として保存する別の方法があることは知っています。しかし、インデックスは少し制限されているように見えますが、すべての例では、値ではなくマップキーに基づいてインデックスを検索しているようです。また、マップ上でのインデックスの使用を妨げる人もいます。

どのようなオプションがありますか?

+0

質問が「私はどのようなオプションがありますか?」あなたはすでにそれに答えています。 – OrangeDog

+0

私はカサンドラを「テーブルのような」よりもむしろキー・バリュー(本当に何であるか)と考えることをお勧めします。また、マップをネストすることはできませんが、不透明なJSON-as-textフィールドを使用することができます。 – OrangeDog

+0

@OrangeDog JSON構造体は実際にはフラットなので、問題はありません。私の質問は、マップを使用して危険な道を追い払うかどうか、私が読んでいない不利な点があるかどうか、そして他の選択肢があるかどうかをさらに詳しく調べることです。 – jbx

答えて

0

私は同じ問題がありました。簡単な短いトリック:キーの列と値の列を作成します。静的な列で使用することもできます。

同様:

CREATE TABLE gameOverview (
     sportType text, sportPropertyIndex1 text static, sportPropertyIndex2 text static, sportPropertyIndex3 text static, 
     sportPropertyValue1 text, sportPropertyValue2 text, sportPropertyValue3 text, 
     PRIMARY KEY(sportType, sportPropertyValue1, sportPropertyValue2, sportPropertyValue3) 
    ) 

静的列は、パーティション内の静的です。パーティションが大きすぎると、静的な列を使用できないことがあります。 (スポーツタイプが大きすぎる可能性があります)。次に、静的な列を使用せず、アプリケーションのこれらの列に注意してください。

/eなぜマップの代わりにこれを使用しましたか?バリューインデックスを作成することもできますが、それはセカンダリインデックスだけです。しかし、あなたが知っているように、セカンダリインデックスのパフォーマンスは最高です。このソリューションでは、プライマリインデックスの利点を利用できますが、マップの柔軟性も備えています。

+0

この場合、プロパティキーを手動でハードコーディングしていませんか?いくつかのフィールドは20フィールドあり、一部のフィールドは30フィールドあります。私はすべてのフィールドを作成しないようにしたい。たとえば、リレーショナルデータベースを使用していた場合、3つのフィールド、ゲームID、属性と値のキーを持つ 'game_info'という別個の1対多テーブルを持つことができ、' select * from game_info where game_id = 1'となる。すべてのフィールドにインデックスを付けると、スタジアムXYZでプレーされるすべてのゲームを得るためにいくつかの参加トリックを使用することができます。 – jbx

関連する問題