如何高效地对多个列进行查询建模?

3

我谦卑地来到这里寻求帮助,因为我对Cassandra建模及其影响的某些方面感到困惑。

我理解的是,理想情况下,我们应该为每个要过滤的列创建一个表。(我遇到了一些二级索引未更新的问题。)

那么让我们举个例子:

class Pet(Model):
    pet_id = columns.UUID(partition_key=True, default=uuid.uuid4)
    name = columns.Text()
    age = colmuns.Text()

class PetByName(Model):
    pet_id = columns.UUID(default=uuid.uuid4)
    name = columns.Text(partition_key=True)
    age = colmuns.Text()

class PetByAge(Model):
    pet_id = columns.UUID(default=uuid.uuid4)
    name = columns.Text()
    age = colmuns.Text(partition_key=True)

如果我只想查询一个属性,查询语句就非常简单:

PetByName.filter(name="kitty")

所以我的第一个问题是:如果我们想要查询名为“kitty”且年龄为“25岁”的宠物,我们该怎么做呢?
目前,我有一个相当繁琐的实现方式,我进行两个查询,然后循环遍历结果,在pet_id属性上执行手动交集。
但在我的脑海中,应该有一种批量查询的实现/类型,可以同时运行这两个查询,然后根据像intersect这样的运算符合并结果集。
欢迎任何帮助、意见或建议。
谢谢阅读,祝您有美好的一天!
1个回答

2
如果您想通过姓名或年龄进行查询,您的表结构应该如下所示:
CREATE TABLE pet_by_name (
     id uuid,
     name text,
     age integer,
     PRIMARY KEY (name, age)
);

在这种情况下,年龄是一个聚簇键。该表支持仅按名称查询或按名称和年龄查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接