http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling
官方给的建议有两点:
- Spread Data Evenly Around the Cluster 写数据分布均匀
- Minimize the Number of Partitions Read 查询涉及最少分片
也给出了一些使用举例了啦,读的时候以为大概知道要领了,结果下地干活的时候发现然而并没有。。
现在我遇到个问题,逻辑类似 Page Rank, score 通过 follow 关系传递给下一个人,然后不断计算到收敛。需要按从高到低排序。
假设有几亿用户,并且好友关系复杂,这个 score 是一个会比较频繁更新的字段。
为了数据均匀,我用比如 username 来做分区键,会导致查询查的时候分区变得随机;
为了查询的时候结果更集中,我用 score 来做分区键,这样会导致作为分区键的值经常变化。
虽然这个文档中没有提到分区键频繁变化会有什么后果,但是可以想象,根据这个分区键来作为划分 cluster 节点的值,会导致数据不断被转移,显然是低效的。
那么我能想到的解决的办法有两个:
- 加一个 score 的区间,按这个字段作为分区键,减少写入时数据在节点间的移动
- 建立一个零时表,用来缓存一次排序结果,这个表中的 score 不作改动
想请教有没有更好的 trade off.