我是Cassandra的新手,最近我在DataStax上看了很多关于数据建模的tutorials。
据我所知,在Cassandra中,我们总是需要为我们想要的查询设置不同的表,例如,甚至是按时间或id对数据进行排序的简单查询。
这意味着我们必须为每个实体提供一些表,这些表根据我们以后要查询的查询而有数据。想象一下,我们有视频,我们可能有一些视频实体表。
第一个问题,正如我所说的每个查询我们必须有一个表格,我们将在不同的列上对视频进行不同类型的排序:
视频表的列是:
video_id | video_title | video_create_year | director | timestap
现在我们应该为其他排序制作其他表吗?
我们可能需要按导演名称(ASC | DESC),video_create_year(ASC | DESC),video_title(ASC | DESC)
对表进行排序我不确定,我们是否应该为每个不同的排序制作不同的表格?
如:
videos_by_diractor_asc
videos_by_diractor_desc
videos_by_title_asc
videos_by_title_desc
所以......
我理解正确吗?
第二个问题,如果我理解正确,那么我忘了在我们的网站中制作一张我可能需要的表格(想象一下,有一天我忘记了有视频_by_title_asc)他们该怎么办?我应该编写程序并从视频表中复制整个数据吗?或者,如果有必要,Cassandra有一些方法可以复制整个数据吗?
我希望这个问题不会引起混淆。
答案 0 :(得分:2)
好的,你对Cassandra有一定的了解。
我希望我理解你。这个表的主键如下所示:
videos_by_diractor_asc PRIMARY KEY(director)
videos_by_title_asc PRIMARY KEY(title)
但是在这种情况下你忘了一件事:分区键。分区键是主键的第一部分。我认为,在你的情况下,这一年是有道理的。具有相同分区键的所有行始终位于同一节点上。 Cassandra通过分区键拆分行。分区键(称为列键)之后的列已排序。分区键本身未排序。这意味着:node1可以具有2015年,1998年和1950年以及node2 2010,1990,1577 .Cassandra在节点之间均匀地分布数据。在建模时,您必须考虑一件重要的事情:在一个分区键中我的表的预期大小是多少。这意味着,在视频案例中,您预计一年中会有多少行? 2 Mio? 1亿?如果你将获得超过2bln行x列,你将遇到一个巨大的问题。 2bln是每个分区键的最大大小。但请记住:它是最大的。我建议不要超过500mio。在最坏的情况下,我用500mio计算。
所以现在我们可以谈谈列密钥。是的,每个排序都需要一个新表。如果要以不同的顺序访问WHERE条件中的数据,还需要一个新表。 一个例子: 你有这个主键 主要关键(年,导演,头衔)
第一个是分区键。这意味着:您总是需要在适合的条件下使用年份。然后,您的数据使用相同的分区键,由导演在ASC中进行排序。经过头衔的导演。在这种情况下,您无法使用此WHERE条件:WHERE年= 2016年和title ='无论'
好的,现在我将回答你的主要问题:) 关于重复数据的事情。在Cassandra 3.0中,您可以使用物化视图。是的,这是一个很好的功能,但它有他的开销。最好的解决方案是在cassandra周围编写一个包装器。这个包装器只做一件事:它处理所有这些重复的数据。它知道什么是访问数据的最佳方式,如果你需要它按标题排序,然后按导演排序,而不是按导演排序,然后按标题排序。还有一件事:无需担心写入数据5次或更多次。 Cassandra针对写作进行了优化。写数据没关系。但是不要忘记一件事:Cassandra是一个已知查询的数据库。如果您知道在此排序顺序中经常需要数据,请为其创建一个表。但是,如果您不了解它,并且仅在下列情况下创建此表:不要创建表。为此,有时查询,您可以使用spark或其他解决方案。
还有一件事:如果你只需要通过一件事来查询数据,比如仅通过标题,只有导演,就不要使用cassandra。这是密钥值存储的主要特征。