我想在.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来实现这个目的而咆哮错误的树?
提前感谢您的回答。
答案 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'}
一些限制
我个人认为这种方法的广泛使用是一种反模式。
HTH, 卡罗
答案 1 :(得分:3)
添加到Carlo的答案: