在 Cassandra 数据库中定义 UDT 的更好方法

Better way to define UDT's in Cassandra database

我们正在尝试删除 table 中的 2 列,其中包含 3 种类型,并将它们设为 UDT,而不是将这 2 列作为列。所以我们想出了以下两个选项。我只是想了解这两个UDT在Cassandra数据库中有什么区别吗?

第一个选项是:

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

然后在 table 定义中这样使用

test_types set<frozen<test_type>>,

第二个选项是:

CREATE TYPE test_type (
    type text,
    hid int
);

然后在 table 定义中这样使用

test_types map<int, frozen<test_type>

所以我很好奇哪个是与性能相关的首选选项,或者它们总体上相同?

这实际上取决于您将如何使用它 - 在第一个解决方案中,您将无法通过 cid 访问 select 元素,因为要访问 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)
);

在这种情况下:

  • 您可以通过指定完整的主键轻松地 select 单个元素。 select 来自 map 的单个元素的能力仅在 Cassandra 4.0 中出现。参见CASSANDRA-7396。在那之前你需要得到完整的地图,即使你需要一个元素,这将限制你的地图大小
  • 您甚至可以 select 值的范围,使用范围查询
  • 您可以通过仅指定分区键(在此示例中为 pk)来获取所有值
  • 您可以 select 多个不连续的值,方法是 select * from test where pk = ... and cid in (..., ..., ...);

请参阅 data model checks best practices doc 中的“检查集合类型的使用”部分。