在Cassandra中存储灵活的架构

时间:2016-06-20 11:59:54

标签: json cassandra

我正在尝试设计一个使用Cassandra而不是传统SQL数据库的新应用程序。聚类和水平缩放功能对我的用例特别有用。

我有这种情况,我有多个记录可能彼此完全不同。例如,如果我存储不同的运动信息,对于足球,我会存储像两支球队,球员,半场和全时的结果,红牌,黄牌等等,而如果是网球比赛则会有比如两个对手,套数等等。

我不希望每个运动都有一张桌子(有负载),并希望能够添加新的运动,而无需每次都修改数据库。我想保持灵活性,这些信息可以根据记录的体育类型随意改变。

如何在Cassandra中对此类信息进行建模?我知道这不是一个'文件'面向数据库,如MongoDB等,但对于应用程序的其余部分,表格类似于'结构Cassandra提供的是理想的。

我知道我可以将它作为JSON字符串存储在文本字段中并在应用程序级别处理它,但我担心这会限制将来批量查询JSON字符串中的字段的所有要求(例如所有匹配有一个特定的裁判)。

我知道还有另一种方法可以将它存储为地图。但是,索引似乎有点受限,所有示例我似乎都根据map键找到索引,而不是值。有些人似乎也不鼓励在地图上使用索引。

我有哪些选择?

1 个答案:

答案 0 :(得分:0)

我有同样的问题。简单的一个简单技巧:您为键创建一列,为该值创建一列。有时您也可以使用静态列。

像:

    CREATE TABLE gameOverview (
        sportType text, sportPropertyIndex1 text static, sportPropertyIndex2 text static, sportPropertyIndex3 text static,
        sportPropertyValue1 text, sportPropertyValue2 text, sportPropertyValue3 text,
        PRIMARY KEY(sportType, sportPropertyValue1, sportPropertyValue2, sportPropertyValue3)
    )

静态列在分区中是静态的。有时你不能使用静态列,因为分区太大了。 (sporttype可能太大了)。然后不要使用静态列,但要小心应用程序中的这些列。

/ e为什么我用这个代替地图?您也可以创建值索引,但它只是一个二级索引。但正如你所知,二级指数的表现并不是最好的。使用此解决方案,您可以使用主索引的优势,但您还可以灵活地使用地图。