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 design Cassandra大分区和重复数据消除_Database Design_Cassandra - Fatal编程技术网

Database design Cassandra大分区和重复数据消除

Database design Cassandra大分区和重复数据消除,database-design,cassandra,Database Design,Cassandra,我有一张桌子 CREATE TABLE user_songs (user_id int, song text, listen_date date, PRIMARY KEY (user_id, song)) 并需要得到独特的用户收听的歌曲。但有些用户可以生成(超过100.000或100 MB) 如果将listen_date添加到分区键(拆分大分区),我无法获得唯一的歌曲,需要在应用程序端使用额外的重复数据消除。它还使分页复杂化 也许有更有效的解决方案?我会像这样为您的数据建模 用户收听的歌曲 用

我有一张桌子

CREATE TABLE user_songs (user_id int, song text, listen_date date, PRIMARY KEY (user_id, song))
并需要得到独特的用户收听的歌曲。但有些用户可以生成(超过100.000或100 MB)

如果将listen_date添加到分区键(拆分大分区),我无法获得唯一的歌曲,需要在应用程序端使用额外的重复数据消除。它还使分页复杂化


也许有更有效的解决方案?

我会像这样为您的数据建模

用户收听的歌曲 用户id(分区键)|歌曲id(群集键)|收听日期

按用户分类的歌曲 用户id(分区密钥)|歌曲id(集群密钥)

每当您将一条记录插入到“按用户收听的歌曲”表时,请在插入后执行这些操作

  • 按用户查找歌曲
  • 如果有记录
    • 是的,那就什么也不做
    • 否,按用户向歌曲添加记录
如果要检索唯一的歌曲,请按用户读取歌曲

数据的非规范化和重复是Cassandra生活中的一个事实。别害怕。


通过对部分分区键使用一致性散列,可以将大分区拆分为多个分区:

CREATE TABLE songs_listenings (
    user_id int,
    song_hash int,
    song text,
    listen_date date,
    PRIMARY KEY (( user_id, song_hash ), song)
);
歌曲散列
-是基于歌曲文本生成的散列。要生成此散列,您需要在应用程序中实现一致的散列函数,该函数将能够为指定的输入参数(歌曲文本)生成指定范围内的某个数字(单个用户希望具有的最大分区数)。(如Guava java库提供)

对于同一首歌曲有多个列表的情况,一致散列将返回相同的数字,因此它将是相同的分区键,并且每个用户只有一条相同歌曲的记录

但由于每个用户将有多个分区,因此必须执行多个请求才能获取用户的所有数据(迭代所有可能的哈希值)