CQL3每行都有自己的架构

Pad*_*ika 8 c# cassandra 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驱动程序开始,我必须始终改变不适合我的表(Column系列).我希望每一行都有自己的架构.Thrift API可能能够解决这个问题,但似乎HectorSharp几乎已经死了.

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

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

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

提前感谢您的回答.

Car*_*ini 14

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

CREATE TABLE toys (
    id text PRIMARY KEY,
    toy map<text, text>
)
Run Code Online (Sandbox Code Playgroud)

放一些数据......

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'});
Run Code Online (Sandbox Code Playgroud)

表内容......

 id | toy
----+-------------------------------------------------------
  3 |    {'category': 'Train', 'number_of_carriages': '10'}
  2 |             {'flying_range': '100m', 'type': 'Plane'}
  1 | {'likes': '3', 'name': 'Car', 'number_of_doors': '4'}
Run Code Online (Sandbox Code Playgroud)

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

CREATE INDEX toy_idx ON toys (KEYS(toy));
Run Code Online (Sandbox Code Playgroud)

...并对Map键执行查询...

SELECT * FROM toys WHERE toy CONTAINS KEY 'name';

 id | toy
----+-------------------------------------------------------
  1 | {'likes': '3', 'name': 'Car', 'number_of_doors': '4'}
Run Code Online (Sandbox Code Playgroud)

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

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'}
Run Code Online (Sandbox Code Playgroud)

一些限制

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

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

HTH,卡罗