如何使值在 cassandra 中独一无二
Posted
技术标签:
【中文标题】如何使值在 cassandra 中独一无二【英文标题】:How to make values unique in cassandra 【发布时间】:2015-02-27 06:21:32 【问题描述】:我想在 cassandra 中设置唯一约束。 因为我希望我的列中的所有值在我的列族中都是唯一的 前任: 名字-拉胡尔 电话 123 地址-abc
现在我希望我这一行没有等于 rahul ,123 和 abc 的值在对 datastax 进行搜索时再次插入我发现我可以通过在分区键上查询 IF NOT EXIST 来实现它,但没有得到解决方案获得所有 3 个唯一值 意味着如果 名字——雅各布 电话 123 地址-qwe
这也不应该插入到我的数据库中,因为我的电话列与我在 name-rahul 中显示的值相同。
【问题讨论】:
【参考方案1】:简短的回答是 Cassandra 不支持任何类型的约束。它们太昂贵了,因为它们必须涉及多个节点,从而违背了首先实现最终一致性的目的。如果您需要使单个列唯一,那么可能有一个解决方案,但不是针对更多唯一列。出于同样的原因 - 没有隔离,没有一致性(来自 ACID 的 C 和 I)。如果你真的需要使用 Cassandra 来执行这种类型的强制,那么你需要创建某种同步应用层,它会拦截 所有 对数据库的请求并确保值是唯一的,并且所有约束都被强制执行。但这与 Cassandra 无关。
【讨论】:
那么你能告诉我一些使列独一无二的替代解决方案吗? 正如我已经提到的,您的应用程序层需要确保它在将数据插入 Cassandra 之前强制执行唯一性。你如何实现它 - 另一个问题。但这不是 Cassandra 可以强制执行的。 这意味着我必须做一些读取操作,但我想问有没有什么解决方案可以在不进行读取操作的情况下获得唯一性。 任何解决方案都必须在 Cassandra 之外构建,因为本质上是一个最终一致的数据库,无法用作同步源。您将需要教您的应用程序如何直接相互通信以保持值的唯一性,将 Cassandra 完全排除在等式之外。【参考方案2】:我知道这是一个老问题,现有答案是正确的(您不能在 C* 中进行约束),但您可以使用批量创建来解决问题。创建一个或多个附加表,每个表都以受约束的列作为主键,然后批量创建,这是一个原子操作。如果这些列值中的任何一个已经存在,则整个批次将失败。例如,如果表名为 Foo,则还要创建 Foo_by_Name(主键 Name)、Foo_by_Phone(主键 Phone)和 Foo_by_Address(主键地址)表。然后当你想添加一行时,创建一个包含所有 4 个表的批处理。您可以复制每个表中的所有列(如果您想按姓名、电话或地址获取时很方便),也可以只包含姓名、电话或地址的一列。
【讨论】:
以上是关于如何使值在 cassandra 中独一无二的主要内容,如果未能解决你的问题,请参考以下文章