Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
Database 如何按Cassandra中的上次更新日期对数据进行排序?_Database_Cassandra_Cql_Cassandra 3.0_Amazon Keyspaces - Fatal编程技术网

Database 如何按Cassandra中的上次更新日期对数据进行排序?

Database 如何按Cassandra中的上次更新日期对数据进行排序?,database,cassandra,cql,cassandra-3.0,amazon-keyspaces,Database,Cassandra,Cql,Cassandra 3.0,Amazon Keyspaces,我需要建议,以正确设计卡桑德拉表。我需要一份所有书的分类清单。排序按上次更新的日期执行。每次购买特定书籍时,number\u\u\u买家列都会更新。此外,我还需要在列中更新updated\u的值。问题在于updated\u at列是clustering键,它是主键的一部分。无法更新作为主键一部分的列中的值 create table books ( book_id uuid, created_at timestamp, updated_at timestamp, book_

我需要建议,以正确设计卡桑德拉表。我需要一份所有书的分类清单。排序按上次更新的日期执行。每次购买特定书籍时,
number\u\u\u买家
列都会更新。此外,我还需要在列中更新
updated\u的值。问题在于
updated\u at
列是
clustering键
,它是
主键
的一部分。无法更新作为主键一部分的列中的值

create table books (
   book_id uuid,
   created_at timestamp,
   updated_at timestamp,
   book_name varchar,
   book_author varchar,
   number_of_buyers int,
   primary key (book_id, updated_at)
) with clustering order by (updated_at desc);
另一个例子:

create table chat_rooms (
   chat_room_id uuid,
   created_at timestamp,
   updated_at timestamp,
   last_message_content varchar,
   last_message_author varchar,
   unread_messages_number int,
   primary key (chat_room_id, updated_at)
) with clustering order by (updated_at desc);

每个聊天室都有最新消息。这些信息总是在变化。如果有变化,我想把聊天室放在列表的首位。许多信使的典型行为。

当然如此;您将需要对不同的内容进行分区。诀窍是在避免未绑定分区增长的同时,找到查询灵活性的适当平衡(您在这里的明显需求)

对于
图书
表,是否可以按
类别
进行分区?你知道,像恐怖、幻想、图画小说、非小说、教学等等

CREATE TABLE book_events (
   book_id uuid,
   created_at timestamp,
   updated_at timestamp,
   book_name varchar,
   book_author varchar,
   number_of_buyers int,
   category text,
   PRIMARY KEY (category, book_name, updated_at, book_id)
) WITH CLUSTERING ORDER BY (book_name ASC,updated_at DESC,book_id ASC);
对于主键定义,我们可以在
category
上进行分区,然后在
book\u name
updated\u at
上进行集群,最后是
book\u id
(为了唯一性)。然后,
为每个销售活动插入一个新行。在查询中(插入几行后),使用
updated_at
上的
MAX
聚合,同时使用
book_name
上的
groupby
子句

SELECT book_name,book_author,number_of_buyers,MAX(updated_at) FROm book_events 
 WHERE category='Computers & Technology' GROUP BY book_name;

 book_name                       | book_author                                                | number_of_buyers | system.max(updated_at)
---------------------------------+------------------------------------------------------------+------------------+---------------------------------
  Mastering Apache Cassandra 3.x |                                Aaron Ploetz, Teja Malepati |               52 | 2020-10-05 14:29:33.134000+0000
 Seven NoSQL Databases in a Week | Aaron Ploetz, Devram Kandhare, Brian Wu, Sudarshan Kadambi |              163 | 2020-10-05 14:29:33.142000+0000

(2 rows)
唯一需要考虑的是如何处理过时的销售行。当然,根据写入频率的不同,您可以在执行时删除它们。最佳的解决方案是考虑销售节奏,并应用TTL。
这个解决方案肯定不完整,但我希望它能指引您正确的方向。

您需要重新思考一种方法-Cassandra中的排序只发生在分区内部,而不是分区之间,因此当前的模型不适合您。你需要问的真正的问题是:你是需要所有书籍的分类列表,还是只需要一些子集?比如,白天卖的书,或者诸如此类的东西。就我而言,我需要一份所有书的清单。如果某本书的任何信息被更新,我需要把它放在列表的顶部。要实现此行为,我必须在表中重新创建一个条目。也就是说,删除记录并再次创建它,但要使用更新的数据。我同意你的看法,模型的设计有问题。您将如何为该请求重新设计模型?该请求的查询将是什么-拉取所有书籍?你真的需要Cassandra来完成这个任务吗,因为所有的书都可以很容易地被mysql或postgresql处理……试着抽象一下。请再次查看我的帖子。这里可能有聊天室来代替书。每个聊天室都有最新消息。这些信息总是在变化。如果有变化,我想把聊天室放在列表的首位。许多信使的典型行为。我认为卡桑德拉在这里不是多余的。此外,你还可以访问所有聊天室,但只能访问最后100个聊天室。你现在有什么想法吗?非常感谢你的回答!我走了一点相反的路,我会对你的意见感兴趣。在过去几天的思考中,我意识到没有完美的解决方案。我想找到正确的平衡点。我用
timeuuid
数据类型创建了一个
book\u id
列。然后将其用作
群集键
。我使用
类别
列作为
分区键
。只有这两列构成了我的
主键
。每次书籍发生变化时,我都会更新位于
updated\u列中的信息。然后,在软件层面,我在
列的
updated\u中按日期对书籍进行排序。在这种情况下,大量负载落在程序上,不方便分页。我必须上传所有数据,但我不必从数据库中删除记录。你怎么看?顺便问一下,你的版本是如何分页的?@NurzhanNogerbek我喜欢你的解决方案。它还有一个额外的好处,即利用Cassandra(压缩)中的内在函数来删除过时的数据。分页并不是我的解决方案的一个考虑因素,而是依赖于驱动程序内置的行分页。谢谢您的回复!不幸的是,我不能用我的解决方案来解决这个问题。不是吗?