我们在一个项目中使用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条目一致?
换句话说,我想要那样:
我的第一个方法是(到处使用法定人数):
如果不是时间戳关系的话,我相信这会奏效。如果两批之间存在联系,我将从第一批中获得一些单元格,而另一些单元格中的一些单元格(cassandra在单元格值上使用词法上更大的值来解决时间戳绑定冲突,如果我相信我对该主题的研究)。 这也可以确认实体创建后会被覆盖,但在我们的系统中这不是真正的问题。
使用cassandra,即使时间戳相关,也可以在这种情况下实现一致性吗? 或者我应该为此开始在我们的系统中安装一个全新的组件吗?
编辑:使用批处理根本不起作用,因为另一个实体可能使用相同的publicName,或同一个privateName,而不是两者。