CQL3每行都有自己的架构

我想在.Net应用程序中使用Cassandra。 我的目标是将一些数据存储在列族中,但每行数据都有不同的模式。

示例(非常简单)我希望有一个’Toys’列系列来存储以下对象,(请注意它们除了ID属性之外还有非常不同的属性)

玩具对象1 {“id”:“1”,“name”:“Car”,“number_of_doors”:4,“赞”:3}

玩具对象2 {“id”:“2”,“type”:“Plane”,“flying_range”:“100m”}

玩具对象3 {“id”:“3”,“category”:“Train”,“number_of_carriages”:10}

从我最初的理解和使用Datastax CSharp驱动程序开始,我必须始终改变不适合我的表(列族)。 我希望每一行都有自己的架构。 Thrift API可能能够解决这个问题,但似乎HectorSharp几乎已经死了。

一个类似于我的要求的问题,但它没有我想要的答案

Cassandra用于无模式数据库,每天有数百万个订单表和数百万个查询

我是通过期望每一行都有自己的架构来咆哮错误的树,还是有办法用Cassandra + Csharp做到这一点?

提前感谢您的回答。

较旧版本的Cassandra是Schema-less,这意味着您没有任何地方可以包含行的定义。 您现在需要的是可以使用Cassandra 2.1上的Map 部分完成

 CREATE TABLE toys ( id text PRIMARY KEY, toy map ) 

放一些数据……

 INSERT INTO toys (id, toy) VALUES ( '1', {'name':'Car', 'number_of_doors':'4', 'likes':'3'}); INSERT INTO toys (id, toy) VALUES ( '2', {'type':'Plane', 'flying_range':'100m'}); INSERT INTO toys (id, toy) VALUES ( '3', {'category':'Train', 'number_of_carriages':'10'}); 

表内容……

  id | toy ----+------------------------------------------------------- 3 | {'category': 'Train', 'number_of_carriages': '10'} 2 | {'flying_range': '100m', 'type': 'Plane'} 1 | {'likes': '3', 'name': 'Car', 'number_of_doors': '4'} 

我们现在可以在键上创建索引了……

 CREATE INDEX toy_idx ON toys (KEYS(toy)); 

…并对Map键执行查询…

 SELECT * FROM toys WHERE toy CONTAINS KEY 'name'; id | toy ----+------------------------------------------------------- 1 | {'likes': '3', 'name': 'Car', 'number_of_doors': '4'} 

现在,您可以像使用普通列一样更新或删除地图条目,而无需在写入之前阅读

 DELETE toy['name'] FROM toys WHERE id='1'; UPDATE toys set toy = toy + {'name': 'anewcar'} WHERE id = '1'; SELECT * FROM toys; id | toy ----+----------------------------------------------------------- 3 | {'category': 'Train', 'number_of_carriages': '10'} 2 | {'flying_range': '100m', 'type': 'Plane'} 1 | {'likes': '3', 'name': 'anewcar', 'number_of_doors': '4'} 

一些限制

  1. 您无法检索集合的一部分:即使内部的每个条目都存储为列,您也只能检索整个集合
  2. 您必须选择是否同时在键或值上创建索引。
  3. 由于地图是打字的,你不能把混合值 – 在我的例子中,所有整数现在都是字符串

我个人认为这种方法的广泛使用是一种反模式。

HTH,卡罗

添加到Carlo的答案:

  1. 旧版cassandra版本(2.1之前版本)不提供集合索引。 次要指数也有局限性,并且最终是一致的。 深入研究这一点。
  2. 不要去寻找“给我所有的汽车玩具”类型查询。 与cassandra的大部分内容一样,请考虑您将如何访问数据(查询)和相应的模型。 根据查询,让多个表存储具有不同结构的玩具数据以便于进行不同的查询是完全可以接受的。