【问题标题】:Cassandra user maintained CF indexesCassandra 用户维护 CF 索引
【发布时间】:2012-04-30 21:57:44
【问题描述】:

以下是我想要作为标准列族的 POJO 的一瞥 卡桑德拉:

class Person {
string key
string name
string dob
List<String> phones
List<String> ids }

显然我的键是我的主索引。 不知道如何做清单?必须为它们创建一个新的 CF,还是将它们全部添加为列?
好的,所以我也希望通过相等搜索所有内容。 获取电话= 1112223333的人 获取名字=Al 和 dob=yyyy-mm-dd 的人

我说的是 1 亿人,所有列大多是唯一的 那么这是否排除了内置的二级索引?

我“得到”了我自己的 CF 作为索引,其中主键是电话,列名是 Person CF 的主键。

但是如果我需要删除手机,给定 key=1234,我如何维护手机的 CF 索引。 TIA Jurgyman

【问题讨论】:

  • 您每人侦察多少电话号码?电话号码和 Person 之间是否存在一对一的映射关系,或者电话号码是否属于多个人?
  • 电话号码上的多对多...夫妻俩都与家庭号码相同。
  • 一个想法是将电话号码作为 JSON 字符串存储在 Person CF 的电话列中。删除电话号码时,您使用给定键查询行,例如1234 删除phone列中的条目,并删除索引CF中的对应行。
  • 为什么是 json?它只是一个列表。为什么不只使用 delim 和 split。此外,还有另一个从 1 到 10k 值的列表属性。但是 avg vals 只是 4。我看到其他人建议将它放在 col 名称中。电话:1115551212 - , ....
  • 格式不重要,你当然可以用你选择的格式。如果您有一个可能包含 10k 个值的 List 属性,我想最好按照建议将值存储在列名中。

标签: java cassandra


【解决方案1】:

首先,二级索引不会是正确的选择,因为它们在基数较低(即重复值很多)的情况下效果很好。电话号码不能满足这一点。它们在技术上可以工作,但随着集群规模的增长,效率会降低。

你说得对,如果你需要一个没有二级索引的双向查找,最好的方法可能是维护你自己的索引。这遵循了以您需要读取数据的方式编写数据的一般设计理念。来自 RDBMS 世界,这可能需要一些时间来适应,因为您已经习惯了规范化。

我认为您缺少的部分是您需要将电话号码存储在两个地方 - 您的个人 CF 和索引。这将允许您查看电话的人和电话的人。当您需要添加/删除手机时,您将同时在两个地方进行操作。您只是将保持关系的逻辑从 DBMS 转移到您的应用程序。

【讨论】:

  • 我见过人们将“数据”作为列名的例子......尤其是在“索引”类型的 CF 中。这样做有收获吗? (也许是 IO,没有 getValue 调用)。如果我的 List 属性之一可以达到 10k... 我是否应该不将它们全部添加为列...并且可能将 10 或 100 放入值中,并且列名如下: attr_10 attr_20 attr_30 (其中 10分隔值在值字段中)。
  • @AlanJurgensen 自从 Cassandra 出现以来,这一直是 Cassandra 模型中的一种流行方法。但是在 Cassandra 1.1 中,CQL 语言增加了一些功能,使得使用这种“转置”或“横向”数据模型变得更加容易。请参阅datastax.com/dev/blog/schema-in-cassandra-1-1,了解复合键如何完美满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多