Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 卡桑德拉中学vs额外表格和阅读_Cassandra_Nosql_Cql - Fatal编程技术网

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第二个表包含具有不同键的数据的想法是消除第二次读取的需要。每个查询类型都有一个数据结构。我明白了,但我仍然需要以某种方式更新数据