【问题标题】:Storing flexible schema in Cassandra在 Cassandra 中存储灵活的模式
【发布时间】:2016-06-20 11:59:54
【问题描述】:

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

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

我不希望每个运动都有一个表(有负载),并且希望能够添加新运动而不必每次都修改数据库。我想保持灵活性,这些信息可以根据记录的运动类型任意更改。

如何最好地在 Cassandra 中对此类信息进行建模?我知道它不是 MongoDB 等面向“文档”的数据库,但对于应用程序的其余部分,Cassandra 提供的“类表”结构是理想的。

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

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

我有什么选择?

【问题讨论】:

  • 如果问题是“我有什么选择?”那你已经回答过了。
  • 我建议将 Cassandra 视为键值(实际上是什么)而不是“类似表”。另请注意,您不能嵌套地图,但如果您使用不透明的 JSON 文本字段,则可以。
  • @OrangeDog JSON 结构实际上可以是扁平的,所以这不是问题。我的问题更多是关于我是否会通过使用地图沿着危险的道路行驶,是否有任何我没有读过的缺点,以及是否有任何其他选择。
  • 您可以将运动视为分区键,您将有一个用于橄榄球的分区,一个用于足球等......然后您只需在需要新的时候创建列。它是最好的选择吗?我不知道,这取决于您将如何处理数据
  • @Whitefret 这里的关键是我真的不想为每个分区手动创建列而烦恼(如果我错了,请纠正我,我必须手动添加它们对吗?)。这些字段可以轻松更改,我只想能够存储任何信息以供参考。我不打算有任何基于此信息的业务逻辑,但仅在请求时通过 REST API 将其返回。

标签: json cassandra


【解决方案1】:

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

喜欢:

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

静态列在分区内是静态的。有时您不能使用静态列,因为否则分区会太大。 (运动型可能太大)。然后不要使用静态列,但要小心应用程序中的这些列。

/e 为什么我用这个而不是地图?您也可以创建价值索引,但它只是一个二级索引。但如您所知,二级索引的性能并不是最好的。使用此解决方案,您可以利用主索引的优势,同时还具有地图的灵活性。

【讨论】:

  • 但是在这种情况下,我不是手动硬编码属性键吗?有些可能有 20 个字段,而有些可能有 30 个不同的字段。我希望避免创建所有字段。例如,如果我使用的是关系数据库,我可以有一个名为game_info 的单独的一对多表,其中包含 3 个字段、游戏 ID、属性的键和值,我会做一个 select * from game_info where game_id = 1。如果我索引所有字段,我可以使用一些连接技巧来让所有比赛都在 XYZ 体育场进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2014-08-19
  • 1970-01-01
  • 2010-09-16
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多