首页 > 解决方案 > 在 Cassandra 数据库中定义 UDT 的更好方法

问题描述

我们正在尝试删除具有 3 种类型的表中的 2 列,并将它们作为 UDT 而不是将这 2 列作为列。所以我们想出了以下两个选项。我只是想了解这两个 UDT 在 Cassandra 数据库中是否有任何区别?

第一个选项是:

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>

所以我只是好奇哪一个是与性能相关的首选选项,或者它们通常是相同的?

标签: cassandradatastax-java-driveruser-defined-types

解决方案


这实际上取决于您将如何使用它 - 在第一个解决方案中,您将无法选择元素 by 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功能仅在 Cassandra 4.0 中提供。参见CASSANDRA-7396。在此之前,即使您需要一个元素,您也需要取回完整的地图,这将限制您的地图大小
  • 您甚至可以使用范围查询选择值的范围
  • 您可以通过仅指定分区键来获取所有值(pk在本例中)
  • 您可以通过执行选择多个非连续值select * from test where pk = ... and cid in (..., ..., ...);

请参阅数据模型检查最佳实践文档中的“检查集合类型的使用”部分。


推荐阅读