首先,请原谅我的英文。这不是我的母语。我正在将SQL数据库移动到Cassandra,但我有一个问题,我无法解决。假设我有一个存储歌曲的SQL表。每首歌都有一个ID作为主键,它允许访问所有相关数据,这些数据存储在由键给出的行的字段中。我也有一些索引使用一些不同的标准作为作者,性别,标题...卡桑德拉:哪个是手工索引的最佳选择
当我想到移动到卡桑德拉模式,我工作围绕的想法,我可以创建一个等效的列家庭,其中歌曲ID是行键,歌曲属性是列。然后,我可以创建5或6个手动索引来按作者,标题,性别等进行搜索。作者,标题...将作为列键(添加一些额外的数据以使它们保持唯一性,使用复合列名称),并且该值将是静态列族中用于搜索的歌曲ID,其中每行由歌曲ID。
但我在这里出现我的疑问。什么更好:每个索引CF只存储ID还是存储所有属性?第一个选项允许我减少必要的内存量,但是我需要(至少)2次读取才能获得每首歌曲的属性。有了第二个选项,我需要更多的内存,因为每个索引重复一次相同的信息,但通过一次读取,我可以获得我需要的所有属性。我想我可以假设需要额外的内存,如果这将是一个更快的模式,但它会更快?拥有更大的数据库不会使其工作变慢?或者较慢的操作是由于Cassandra存储行的方式以及由于2次读取而搜索由索引CF给出的每一行?我使用第二个选项(在CF中存储所有作为“索引”的属性)计算出我比第一个选项需要大约80%的内存(CFs真的可以作为索引来查找歌曲的“主要”CF中的正确数据)。
任何帮助将不胜感激。
在此先感谢!
我的直觉说宽行是一种更好的方法,但我想知道一些经历过类似情况的专家的意见。非常感谢你,Dean。我将检查PlayOrm的wiki;) – Janbalik
宽行可以进入数百万列。我肯定不会超过1000万,也许不会超过几百万。我们做了100万,没有问题,PlayOrm的连接工作速度与hibernate + postgres一样快(PlayOrm可以连接分区,分区通常不会超过数百万行) –
当然。我们已经完成了2个设计,每个我们正在考虑的方法都有一个设计。基于宽行的(我提到的第二个选项)旨在将列数保持在100万以下。最宽的行大约有100.000 - 200.000列,小于5MB。 – Janbalik