在cassandra中保存对象数组

bttbmeg0  于 2021-06-09  发布在  Cassandra
关注(0)|答案(2)|浏览(542)

如何在cassandra中保存对象数组?
我正在使用nodejs应用程序并使用cassandra驱动程序连接到cassandra数据库。我想在数据库中保存如下记录:

{
"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”的值。但不确定如何定义模式并为字段“logs”保存数据。

xpcnnkqh

xpcnnkqh1#

根据您希望如何查询此数据,您有几个选项。
第一种方法是在logs字段中对json进行字符串化,并将其保存到数据库中,然后在查询数据后将其转换回json。
第二个选项与第一个选项类似,但不是对数组进行字符串化,而是将数据作为列表存储在数据库中。
第三个选项是为日志定义一个新表,其中包含会话的主键和日志中每个元素的集群键。这将允许您按完整键或仅按主键进行查询,并检索与这些条件匹配的所有行。

CREATE TABLE conversationlogs (
  conversationid uuid,
  logid timeuuid,
  ...
  PRIMARY KEY ((conversationid), logid));
njthzxwz

njthzxwz2#

使用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));

相关问题