CQL3每行都有自己的架构

时间:2014-08-02 19:07:47

标签: c# cassandra cql3

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

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

玩具对象1 {“id”:“1”,     “名”:“汽车”,     “number_of_doors”:4,     “喜欢”:3}

玩具对象2 {“id”:“2”,     “类型”:“平面”,     “flying_range”: “百米”}

玩具对象3 {“id”:“3”,     “类别”:“列车”,     “number_of_carriages”:10}

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

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

Cassandra for a schemaless db, 10's of millions order tables and millions of queries per day

我是通过期望每一行都有自己的架构或者有没有办法使用Cassandra + Csharp来实现这个目的而咆哮错误的树?

提前感谢您的回答。

2 个答案:

答案 0 :(得分:12)

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

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

放一些数据......

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

...并对地图键执行查询...

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. 由于地图是键入的,因此您无法输入混合值 - 在我的示例中,所有整数现在都是字符串
  4. 我个人认为这种方法的广泛使用是一种反模式。

    HTH, 卡罗

答案 1 :(得分:3)

添加到Carlo的答案:

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