datastax—在cassandra中,如何管理具有唯一值的可写列

cngwdvgl  于 2021-06-10  发布在  Cassandra
关注(0)|答案(0)|浏览(198)

我正在为以下用例设计一个模式:
我们要保存到db的对象包含3个属性(type、name、id)。
确保(类型、名称)的组合是唯一的。
确保id是唯一的。
按(类型、名称)查找行。
按id查找行。
列出给定类型的所有行。
按行的(类型、名称)删除行。
更新行的名称。更新后,类型和id不应更改,名称仍应唯一,即类型和名称不可更新。
按类型、名称和id创建行。
所有的create/get/list/update/delete请求都可以来自不同的节点。在同一个节点中,请求可以来自不同的服务。节点数小于1000。
行数相对较少(最坏情况为12000行,通常远小于1000行),大多数操作是get/list。读取性能并不重要。
我试过:
我们尝试了主键(类型、名称)。在这种情况下,特性8是不可能的,因为名称是主键的一部分,因此不可更新。
我们尝试了主键(type,id)或仅(id)。cassandra不允许对列设置唯一约束。
一。如果我先读后写,两个操作之间可能存在竞争条件。功能10不满足。
二。我还研究了批处理操作,因为据说它是原子的,在单个分区上是隔离的。https://docs.datastax.com/en/cql/3.3/cql/cql_using/usebatch.html 然而,对隔离的描述“隔离确保在所有操作完成之前不访问部分插入或更新”与传统dbs的隔离定义不同。如果cassandradb阻塞了所有其他读/写操作,那么这对于用例来说是很好的。如果不是,那么最重要的是批处理操作会阻止所有其他写操作。有人能解释一下在单个分区上批处理操作的实际隔离级别吗?
我发现一个线程说使用物化视图可以用来强制二级索引的唯一性。是否可以在cassandra中创建唯一的二级索引?。为了确保(type,name)的唯一性,具体化视图的主键应该是(type,name),id不应该是它的一部分。那么if不能是表主键的一部分,根据限制:物化视图必须“在物化视图的主键中包含源表的所有主键”https://docs.datastax.com/en/cql/3.3/cql/cql_using/usecreatemv.html. 但是,如果我们想支持特性8,名称不能是表主键的一部分。那就没有解决办法了。
我想有一个所有这些功能的解决方案,但我的poc没有一个满足所有的要求。如果您对强制执行唯一性、强制执行写隔离和/或任何更好的解决方案和想法有任何想法,请将其放在评论中。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题