在Cassandra中某些表之间同步(复制)数据的标准方法是什么?

时间:2016-05-26 11:39:21

标签: database sorting cassandra data-modeling datastax

我是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)

我希望这个问题不会引起混淆。

1 个答案:

答案 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。这是密钥值存储的主要特征。