Cassandra 卡桑德拉中学vs额外表格和阅读
我正面临着一个进退两难的境地,我对卡桑德拉所知甚少,无法解决这个难题。Cassandra 卡桑德拉中学vs额外表格和阅读,cassandra,nosql,cql,Cassandra,Nosql,Cql,我正面临着一个进退两难的境地,我对卡桑德拉所知甚少,无法解决这个难题。 我有一个索引表,用于使用外部id从项目(通知)检索数据。但是,该表中包含的数据(在这种情况下,通知的状态)已修改,因此我还需要更新索引表。以下是表格设计: TABLE notification_by_external_id ( external_id text, partition_key_date text, id uuid, status text, ... PRIMARY
我有一个索引表,用于使用外部id从项目(通知)检索数据。但是,该表中包含的数据(在这种情况下,通知的状态)已修改,因此我还需要更新索引表。以下是表格设计:
TABLE notification_by_external_id (
external_id text,
partition_key_date text,
id uuid,
status text,
...
PRIMARY KEY (external_id, partition_key_date, id)
);
TABLE notification (
partition_key_date text,
status text,
id uuid,
...
PRIMARY KEY (partition_key_date, status, id)
);
问题是,当我想要更新通知状态(以及由此更新的“由外部通知”id表)时,我没有访问外部id的权限。到目前为止,我提出了两个解决方案,其中没有一个看起来是最优的,我无法决定使用哪一个 解决方案1
通过\u external\u id.id在通知\u上创建索引,但这显然是一个高基数列。每个通知可以有几个外部ID,但我们讨论的是5-10比1 解决方案2
创建一个表
TABLE external_id_notification (
notification_id uuid,
external_id text
PRIMARY KEY (notification_id, external_id)
);
但这意味着要进行一次额外的读取操作(当然还要维护另一个表),我知道这也是一种不好的做法。关于二级索引,需要了解的是,它们的可伸缩性问题不是表中的行数,而是集群中的节点数。索引列上的select意味着每个节点都必须处理它并响应它,只是它本身能够高效地处理select 仅出于管理目的使用二级索引(即您在cqlsh上)。不要将其用于生产目的
话虽如此。您可以将所有信息复制到
外部\u id\u通知
表中。这将减少额外读取操作的需要。我知道关系数据库教会了你,重复数据是不好的(如果它不同怎么办?),你应该经常规范化。但您不在关系数据库上。非规范化是一件事,在Cassandra上,你应该一直这样做,除非你绝对不能。使用2-除非绝对必要,否则避免使用二级索引,因为有太多的惊喜和陷阱要列出。第二个表的问题是显而易见的,但重复应用数据并不能解决通过外部id更新通知的问题table@Adrien不,没有。这是非规范化,在NoSQL数据库上要做的事情。您使用相同数据的不同结构填充多个表。因此,获取分区键所需的额外读取并没有那么糟糕,对吗?@Adrien第二个表包含具有不同键的数据的想法是消除第二次读取的需要。每个查询类型都有一个数据结构。我明白了,但我仍然需要以某种方式更新数据