【发布时间】:2016-03-06 19:16:41
【问题描述】:
根据我的阅读,我看不到任何指定唯一性约束的选项。我想知道这是否可能?将列更改为主键还需要更改其他一些表。这就是为什么我要问是否有可能有一个唯一的二级索引?
【问题讨论】:
标签: cassandra
根据我的阅读,我看不到任何指定唯一性约束的选项。我想知道这是否可能?将列更改为主键还需要更改其他一些表。这就是为什么我要问是否有可能有一个唯一的二级索引?
【问题讨论】:
标签: cassandra
Cassandra 3.0 中的materialized views 功能旨在帮助解决这个问题。您可以在唯一的辅助列上创建具体化视图,以便您可以使用该列作为主键查询视图。
有一些 limitations 使用此功能,因为 Cassandra 必须在后台为您做很多簿记,以使物化视图保持最新。
【讨论】:
当然可以。问题是它会表现得很糟糕。
Cassandra 将在后台创建一个引用每个索引值和行的表。每个节点将在本地存储自己的索引部分。所以你的索引基本上和你的原始表一样多的行,除了它不会被分发。
最后一部分是关键。当您查询该索引时,您将在等式中引入网络延迟,因为需要查询每个节点以查看它是否包含索引值。
这就是二级索引很烂的原因。高基数指数更糟糕。此解决方案在分布式环境中失败,因为它无法扩展。
Apple 的 Richard Low 就这个主题写了一篇很棒的文章:The Sweet Spot for Cassandra Secondary Indexing。读一读。
【讨论】:
AFAIK,Cassandra 不支持列的唯一性,v2 中有 lightweight transactions 在行级别上工作 - 此块写入现有键,否则它将被覆盖(即唯一性是作为主键显然)。这些不适用于列值。
但是您可以在客户端中使用应用程序逻辑来实现它...
修改写操作为先查询新表中的列值
如果已经存在(使用轻量级事务或简单读取),则阻止向另一个表插入新行(因此,原始表的每次写入/更新/删除都与列值表相关联) .
其他块写入...
要获得连接/位置功能,请在列值上创建索引(在原始表中)。
丑陋,如果客户决定忽略合同,它就不起作用,但否则会起作用,而且如果它是一张这么小的桌子,也应该很快。
【讨论】: