在 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 中的“检查集合类型的使用”部分。
我们正在尝试删除 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 中的“检查集合类型的使用”部分。