1

如何在 cassandra 中保存对象数组?
我正在使用 nodeJS 应用程序并使用 cassandra-driver 连接到 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"
}  

在上面的记录中,我可以使用“text”类型来保存“id”和“conversationId”列的值。但不确定如何定义架构并为“日志”字段保存数据。

4

2 回答 2

0

您有几个选项,具体取决于您要如何查询此数据。

第一种是将日志字段中的json字符串化并保存到数据库中,然后在查询数据后将其转换回JSON。

第二个选项与第一个选项类似,但不是对数组进行字符串化,而是将数据作为列表存储在数据库中。

第三个选项是为日志定义一个新表,其中包含对话的主键和日志每个元素的集群键。这将允许您通过全键查找或仅通过主键查询并检索与这些条件匹配的所有行。

CREATE TABLE conversationlogs (
  conversationid uuid,
  logid timeuuid,
  ...
  PRIMARY KEY ((conversationid), logid));
于 2020-09-01T18:51:23.417 回答
0

使用 Cassandra,您需要以与查询数据相同的方式存储数据。正如您提到conversatonid的查询 by ,这将影响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));
于 2020-09-01T18:22:44.057 回答