如何解决在Cassandra中保存对象数组
如何在cassandra中保存对象数组?
我正在使用nodeJS应用程序,并使用cassandra驱动程序连接到Cassandra DB。我想将以下记录保存在数据库中:
{
"id" : "5f1811029c82a61da4a44c05","logs" : [
{
"conversationId" : "e9b55229-f20c-4453-9c18-a1f4442eb667","source" : "source1","destination" : "destination1","url" : "https://asdasdas.com","data" : "data1"
},{
"conversationId" : "e9b55229-f20c-4453-9c18-a1f4442eb667","source" : "source2","destination" : "destination2","url" : "https://afdvfbwadvsffd.com","data" : "data2"
}
],"conversationId" : "e9b55229-f20c-4453-9c18-a1f4442eb667"
}
在上面的记录中,我可以使用“文本”类型保存“ id”和“ conversationId”列的值。但是不确定如何定义架构并保存“日志”字段的数据。
解决方法
对于Cassandra,您将希望以与查询数据相同的方式来存储数据。正如您提到的conversatonid
查询一样,这将影响PRIMARY KEY
定义的外观。鉴于此,conversationid
应该是一个很好的分区键。至于聚类列,我不得不对基数进行一些猜测。因此,sourceid
看起来可以用来唯一标识对话中的日志条目,因此我接下来继续讨论。
我考虑过使用id
作为最后的聚类列,但是看起来所有具有相同conversationid
的条目也将具有相同的id
。为每个条目分配自己的唯一标识符可能是个好主意,以帮助确保唯一性:
{
"uniqueid": "e53723ca-2ab5-441f-b360-c60eacc2c854","conversationId" : "e9b55229-f20c-4453-9c18-a1f4442eb667","source" : "source1","destination" : "destination1","url" : "https://asdasdas.com","data" : "data1"
},
这使最终表定义如下所示:
CREATE TABLE conversationlogs (
id TEXT,conversationid TEXT,uniqueid UUID,source TEXT,destination TEXT,url TEXT,data TEXT,PRIMARY KEY (conversationid,sourceid,uniqueid));
,
根据查询数据的方式,您有几种选择。
首先是在日志字段中将json字符串化并将其保存到数据库中,然后在查询数据后将其转换回JSON。
第二个选项与第一个选项相似,但是您无需将数组字符串化,而是将数据作为列表存储在数据库中。
第三个选项是使用对话的主键和日志的每个元素的聚类键为日志定义一个新表。这将允许您通过全键查找或仅通过主键查询,并检索与那些条件匹配的所有行。
CREATE TABLE conversationlogs (
conversationid uuid,logid timeuuid,...
PRIMARY KEY ((conversationid),logid));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。