Ser*_*tko 6 data-modeling cql cassandra cql3
我在cassandra中呈现复杂的数据结构时遇到问题. JSON数据示例:
{
"A": {
"A_ID" : "1111"
"field1": "value1",
"field2": "value2",
"field3": [
{
"id": "id1",
"name": "name1",
"segment": [
{
"segment_id": "segment_id_1",
"segment_name": "segment_name_1",
"segment_value": "segment_value_1"
},
{
"segment_id": "segment_id_2",
"segment_name": "segment_name_2",
"segment_value": "segment_value_2"
},
...
]
},
{
"id": "id2",
"name": "name2",
"segment": [
{
"segment_id": "segment_id_3",
"segment_name": "segment_name_3",
"segment_value": "segment_value_3"
},
{
"segment_id": "segment_id_4",
"segment_name": "segment_name_4",
"segment_value": "segment_value_4"
},
...
]
},
...
]
}
}
Run Code Online (Sandbox Code Playgroud)
将仅使用一个查询: 按A_ID查找.
我认为这些数据应该存储在一个TABLE(列族)中,而不需要序列化/反序列化操作,以提高效率.如果CQL不支持嵌套地图和列表,我该怎么做?
Cassandra 2.1增加了对嵌套结构的支持:https://issues.apache.org/jira/browse/CASSANDRA-5590
"仅将其存储为json/protobuf/avro/etc blob"的缺点是,您必须读取并重写整个blob以更新任何字段.所以至少你应该把你的顶级字段拉到Cassandra列中,适当地利用集合.
由于您将它用作键/值,因此您实际上可以将其存储为 JSON,或者为了更有效地保存数据,例如 BSON 或事件 Protobuf。
我个人会将其存储在 Protobuf 记录中,因为它不会保存在您的情况下可能重复的字段名称。