protobuf消息' sessionproto'我收到的字段是递归的。
itemrelationproto引用itemgroupproto和itemgroupproto引用itemrelationproto。
如何在Cassandra中定义数据模型来存储这些数据?
感谢。
message itemrelationproto {
optional string id = 1;
optional itemgroupproto itemgroup = 2;
}
message itemgroupproto {
optional string id = 1;
optional string displayname = 2;
repeated itemrelationproto itemrelations = 3;
}
message sessionproto {
optional string sessionid = 1;
optional string displayname = 3;
repeated itemrelationproto itemrelations = 4;
}
create type itemrelationproto (
id text,
itemgroup frozen<itemgroupproto>
);
create type itemgroupproto (
id text,
displayname text,
itemrelations set<frozen<itemrelationproto>>
);
create table sessionproto (
sessionid text,
displayname text,
itemrelations set<frozen<itemrelationproto>,
primary key (sessionid)
);
答案 0 :(得分:2)
Cassandra中的数据建模与您要存储的对象无关,而与您要对数据执行的查询有关。
以下链接可能会有所帮助:
上面博客文章中的这句话总结得非常好:
不要围绕关系建模。不要围绕物体建模。围绕您的查询建模。
因此,如果不知道您要执行哪些查询,则无法建议正确的数据模型。
答案 1 :(得分:1)
Cassandra不是关系数据库,因为您无法存储引用彼此的项目。所以在Cassandra中无法进行递归。
但是你要做的是递归地定义一个当前不可能的类型。我建议的解决方案是将您的proto转换为字节数组或json或其他任何内容,并将其存储在text
或blob
字段中。另一个解决方案是创建多个表并分别存储每个消息,但是您需要多个请求才能选择整个sessionproto
。