【发布时间】:2016-06-20 11:59:54
【问题描述】:
我正在尝试设计一个使用 Cassandra 而不是传统 SQL 数据库的新应用程序。集群和水平缩放功能对我的用例特别有用。
我有这种情况,我有多个可能彼此完全不同的记录。例如,如果我要存储不同的运动信息,对于足球,我会存储两支球队、球员、半场和全场后的结果、红牌、黄牌等,而如果是网球比赛,它将有比如两个对手,盘数等等。
我不希望每个运动都有一个表(有负载),并且希望能够添加新运动而不必每次都修改数据库。我想保持灵活性,这些信息可以根据记录的运动类型任意更改。
如何最好地在 Cassandra 中对此类信息进行建模?我知道它不是 MongoDB 等面向“文档”的数据库,但对于应用程序的其余部分,Cassandra 提供的“类表”结构是理想的。
我知道我可以将它作为 JSON 字符串存储在文本字段中并在应用程序级别对其进行处理,但我担心这会限制将来对 JSON 字符串中的字段进行批量查询的任何要求(例如所有匹配的有一个特定的裁判)。
我知道还有另一种方法可以将其存储为地图。但是,索引似乎有点有限,我似乎根据映射键而不是值找到索引的所有示例。有些人似乎也不鼓励在地图上使用索引。
我有什么选择?
【问题讨论】:
-
如果问题是“我有什么选择?”那你已经回答过了。
-
我建议将 Cassandra 视为键值(实际上是什么)而不是“类似表”。另请注意,您不能嵌套地图,但如果您使用不透明的 JSON 文本字段,则可以。
-
@OrangeDog JSON 结构实际上可以是扁平的,所以这不是问题。我的问题更多是关于我是否会通过使用地图沿着危险的道路行驶,是否有任何我没有读过的缺点,以及是否有任何其他选择。
-
您可以将运动视为分区键,您将有一个用于橄榄球的分区,一个用于足球等......然后您只需在需要新的时候创建列。它是最好的选择吗?我不知道,这取决于您将如何处理数据
-
@Whitefret 这里的关键是我真的不想为每个分区手动创建列而烦恼(如果我错了,请纠正我,我必须手动添加它们对吗?)。这些字段可以轻松更改,我只想能够存储任何信息以供参考。我不打算有任何基于此信息的业务逻辑,但仅在请求时通过 REST API 将其返回。