在cassandra数据库中定义udt的更好方法

ukxgm1gy  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(477)

我们正在尝试删除一个包含3种类型的表中的2列,并将它们作为udt,而不是将这2列作为列。所以我们提出了以下两种选择。我只是想了解一下Cassandra数据库中这两个udt是否有什么不同?
第一种选择是:

CREATE TYPE test_type (
    cid int,
    type text,
    hid int
);

然后在表定义中这样使用

test_types set<frozen<test_type>>,


第二种选择是:

CREATE TYPE test_type (
    type text,
    hid int
);

然后在表定义中这样使用

test_types map<int, frozen<test_type>

所以我很好奇,在这里,哪一个是与性能相关的首选方案,或者两者大体相同?

cu6pst1q

cu6pst1q1#

这实际上取决于您将如何使用它-在第一个解决方案中,您将无法选择元素 cid ,因为要访问 set 元素,您需要指定完整的udt值和所有字段。
更好的解决方案如下,假设只有一个集合列:

CREATE TYPE test_type (
    type text,
    hid int
);

create table test (
  pk int, 
  cid int
  udt frozen<test_type>,
  primary key(pk, cid)
);

在这种情况下:
通过指定完整的主键,可以轻松地选择单个元素。从中选择单个元素的能力 map 只有Cassandra4.0版本。见Cassandra-7396。在此之前,即使需要一个元素,也需要返回完整的Map,这将限制Map的大小
您甚至可以使用范围查询来选择值的范围
您可以通过只指定分区键来获取所有值( pk 在本例中)
通过执行以下操作可以选择多个非连续值 select * from test where pk = ... and cid in (..., ..., ...); 请参阅数据模型检查最佳实践文档中的“检查集合类型的使用”部分。

相关问题