0

すべての人のレコードが UUID によって識別され、すべてのグループが UUID によって識別されると仮定します。グループ内のすべてのユーザーのリストと、ユーザーが属するすべてのグループのリストに対して共通のクエリを実行する必要がある場合、どのデータ モデルを作成しますか。すなわち

create table membership (
    person_uuid uuid,
    group_uuid uuid,
    joined bigint,
    primary key (person_uuid, group_uuid));

上記は個人によるクエリを最適化し、以下はグループによるクエリを最適化します。

create table membership (
    group_uuid uuid,
    person_uuid uuid,
    joined bigint,
    primary key (group_uuid, person_uuid));

「フィルタリングを許可する」を使用person_uuidしなくても、最適にクエリを実行できるようにするための適切な方法はありますか。つまり、次のようになります。group_uuid

select group_uuid from membership where person_uuid=?
select person_uuid from membership where group_uuid=? allow filtering

先に進んで、両方向のクエリ用にデータの 2 つのコピーを保存しますか?これには原子性の問題がありますが、そうですか?

4

1 に答える 1

0

@ジェイコブ

できることは、プライマリ キーの 2 番目のクラスタリング コンポーネントにセカンダリ インデックスを作成して、クエリを実行できるようにすることです。

create table membership (
    person_uuid uuid,
    group_uuid uuid,
    joined bigint,
    primary key (person_uuid, group_uuid));

create index on membership(group_uuid);

もちろん、クエリに許可フィルタリングを追加する必要がありますが、インデックスがない場合よりもはるかに高速になります。

セカンダリ インデックスを使用せずに 2 つのテーブルのインデックス データを使用することを選択した場合は、データを挿入するときにアトミック バッチを使用して原子性を保証できます。

于 2013-09-21T09:18:43.523 に答える