C# CQL3每一行都有自己的模式
我想在.Net应用程序中使用Cassandra。我的目标是在列族中存储一些数据,但每行数据都有不同的模式 示例(一个非常简单的示例)我希望有一个“Toys”列族来存储以下对象(注意它们的属性与ID属性不同) 玩具物体1 {“id”:“1”, “名称”:“汽车”, “门的数量”:4, “喜欢”:3} 玩具物体2 {“id”:“2”, “类型”:“平面”, “飞行距离”:“100米”} 玩具物体3 {“id”:“3”, “类别”:“列车”, “车厢数量”:10辆 从我对Datastax CSharp驱动程序的最初理解和使用来看,我必须始终更改不适合我的表(列族)。我希望每一行都有自己的模式。节俭API也许能够解决这个问题,但赫克托沙普似乎已经死了 一个与我的要求类似的问题,但没有我想要的答案 我期望每一行都有自己的模式,这是不是找错了方向?或者有没有办法使用Cassandra+Csharp实现这一点C# CQL3每一行都有自己的模式,c#,cassandra,cql3,C#,Cassandra,Cql3,我想在.Net应用程序中使用Cassandra。我的目标是在列族中存储一些数据,但每行数据都有不同的模式 示例(一个非常简单的示例)我希望有一个“Toys”列族来存储以下对象(注意它们的属性与ID属性不同) 玩具物体1 {“id”:“1”, “名称”:“汽车”, “门的数量”:4, “喜欢”:3} 玩具物体2 {“id”:“2”, “类型”:“平面”, “飞行距离”:“100米”} 玩具物体3 {“id”:“3”, “类别”:“列车”, “车厢数量”:10辆 从我对Datastax CSharp
提前感谢您的回答。旧版本的Cassandra没有模式,这意味着您对行可以包含的内容没有任何定义。您现在需要的可以通过Cassandra 2.1上的
地图部分完成
CREATE TABLE toys (
id text PRIMARY KEY,
toy map<text, text>
)
表格内容
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'}
一些限制
无法检索集合的一部分:即使映射的每个条目在内部存储为列,也只能检索整个集合
您必须选择是对键还是对值同时创建索引
不支持
因为映射是类型化的,所以不能放入混合值——在我的示例中,所有整数现在都是字符串
我个人认为这种方法的广泛使用是一种反模式。
嗯,,
卡洛要补充卡洛的答案:
旧版本的cassandra(2.1之前)上没有集合索引。次级指数也有局限性,最终是一致的。深入研究这个问题
不要用这个来寻找“给我所有汽车玩具”类型的查询。与大多数cassandra一样,考虑如何访问相应的数据(查询)和模型。根据查询的不同,使用多个表存储不同结构的玩具数据以方便不同的查询是完全可以接受的
谢谢Carlo,我现在已经接受了您最正确的答案,但是正如您所指出的,使用maps会将我的所有数据限制为map定义中定义的类型。当检索这些数据并将其发送回希望其为原始格式的用户时,这会造成问题。这不是一个大问题。一旦知道映射中字符串的正确类型,您只需执行Integer.valueOf()或UUID.fromString()或在将数据发送回客户端之前需要转换的任何内容。几分钟内,我了解了cassandra的工作、存储、检索和限制。回答得好(y)
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'}