【问题标题】:Storing person group membership under cassandra在 cassandra 下存储人员组成员身份
【发布时间】:2013-09-21 05:15:58
【问题描述】:

假设所有人员记录均由 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_uuidgroup_uuid 进行最佳查询,而无需使用“允许过滤”,即:

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

您是否继续存储两个数据副本以供双向查询,但这存在原子性问题,对吗?

【问题讨论】:

    标签: cassandra cql cql3


    【解决方案1】:

    @雅各布

    您可以做的是在主键的第二个集群组件上创建二级索引,以便能够对其进行查询。

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

    当然,您需要在查询中添加允许过滤,但这会比没有索引要快得多。

    如果你选择使用2表索引数据而不使用二级索引,你可以在插入数据时使用原子批处理来保证原子性

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2019-07-05
      • 1970-01-01
      • 2012-03-06
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多