4

私は次のテーブルで作業します:

CREATE TABLE IF NOT EXISTS lp_registry.domain (
    ownerid text,
    name1st text,
    name2nd text,
    name3rd text,
    registrar text,
    registered timestamp,
    expiration timestamp,
    updated timestamp,
    technologies list<text>,
    techversions list<text>,
    ssl boolean,
    PRIMARY KEY (
        (name1st, name2nd, name3rd), 
        registrar, ownerid, registered, expiration, updated
    )
);

テーブルは更新されず、新しい行が追加されるだけです。クローラーがドメインをチェックするたびに、新しい行が追加されます。

私はこの選択を実行しています:

SELECT * FROM lp_registry.domain WHERE 
    registrar = 'REG-WEDOS' AND 
    ownerid = 'FORPSI-JAF-S497436' 
ALLOW FILTERING;

しかし、結果に必要なのは、一意の「name3rd.name2nd.name1st」ごとに最新の「更新された」値を持つ行のみです。

もし私が標準的な SQL データベースを使っていたら、MAX または GROUP BY でネストされた選択を使用します。ただし、これは Cassandra ではサポートされていません ( Cassandraの MAX()、DISTINCT および group by )。しかし、私はCQLで何をすべきですか?

4

2 に答える 2

3

スキーマ全体を変更する必要があります。あなたSELECTがやっていることは、アプリケーションの観点から明らかに重要なものである必要はありませんALLOW FILTERING。データを非正規化し、registrarowneridがパーティション キーであるテーブルを作成する必要があります。

その非正規化構造でupdatedは、 でソートされたパーティション キーである必要がありますDESC。クエリは次のようになります

SELECT * FROM lp_registry.domain WHERE registrar='XXX' AND ownerid='YYY' LIMIT 10;

行は挿入されるが更新されることはないと言っているように、必要に応じて複数の非正規化テーブルに新しいデータを挿入することは、アプリケーションで複雑にすべきではありません。

Andy's answerは、テーブル構造の詳細と例を提供します。

于 2016-01-02T12:53:58.790 に答える