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(集群密钥) 每当您将一条记录插入到“按用户收听的歌曲”表时,请在插入后执行这些操作
- 按用户查找歌曲李>
- 如果有记录
- 是的,那就什么也不做
- 否,按用户向歌曲添加记录
通过对部分分区键使用一致性散列,可以将大分区拆分为多个分区:
CREATE TABLE songs_listenings (
user_id int,
song_hash int,
song text,
listen_date date,
PRIMARY KEY (( user_id, song_hash ), song)
);
歌曲散列
-是基于歌曲文本生成的散列。要生成此散列,您需要在应用程序中实现一致的散列函数,该函数将能够为指定的输入参数(歌曲文本)生成指定范围内的某个数字(单个用户希望具有的最大分区数)。(如Guava java库提供)
对于同一首歌曲有多个列表的情况,一致散列将返回相同的数字,因此它将是相同的分区键,并且每个用户只有一条相同歌曲的记录
但由于每个用户将有多个分区,因此必须执行多个请求才能获取用户的所有数据(迭代所有可能的哈希值)