多列中的一致唯一值

时间:2017-03-02 15:43:46

标签: cassandra

我们在一个项目中使用Cassandra,虽然我们的大多数数据都适合Cassandra的本质,但我们有一些表没有。我正在调查我们是否需要一个单独的系统(可能是一个酸性数据库)来覆盖这个或者我们是否可以使用Cassandra。

我们希望对2列强制执行唯一约束:publicName和privateName。我们实体的人工主键是UUID。我们还假设数据模型中有一个额外的列,比如entityType。

在SQL db中我们会这样做:

entityId UUID PK | publicName TEXT UNIQUE INDEX | privateName TEXT UNIQUE INDEX | entityType INT

第一直觉是制作三张表:

entityId UUID PK | publicName TEXT | privateName TEXT | entityType INT
entityId UUID | publicName TEXT PK | privateName TEXT | entityType INT
entityId UUID | publicName TEXT | privateName TEXT PK | entityType INT

第一个表不是问题:如果那里有一些额外的实体,它不会影响应用程序,因为没有对它的引用。也不存在写冲突,因为我们只生成UUID。

但是,当我有一个publicName条目时,我怎么能确定该条目始终与privateName条目和UUID条目一致;当我有一个privateName条目时,该条目总是与publicName条目和UUID条目一致?

换句话说,我想要那样:

  • 存在一些publicName的条目暗示相同的条目存在(或将很快存在)UUID索引和privateName索引表
  • 进入 某些privateName存在暗示相同的条目存在(或将很快存在) UUID索引和publicName索引表

我的第一个方法是(到处使用法定人数):

  1. 检查是否采用了publicName或privateName,如果采用则失败
  2. 以已记录的批次
  3. 插入3个表格

    如果不是时间戳关系的话,我相信这会奏效。如果两批之间存在联系,我将从第一批中获得一些单元格,而另一些单元格中的一些单元格(cassandra在单元格值上使用词法上更大的值来解决时间戳绑定冲突,如果我相信我对该主题的研究)。 这也可以确认实体创建后会被覆盖,但在我们的系统中这不是真正的问题。

    使用cassandra,即使时间戳相关,也可以在这种情况下实现一致性吗? 或者我应该为此开始在我们的系统中安装一个全新的组件吗?

    编辑:使用批处理根本不起作用,因为另一个实体可能使用相同的publicName,或同一个privateName,而不是两者。

0 个答案:

没有答案