cassandra - 在 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>
所以我只是好奇哪一个是与性能相关的首选选项,或者它们通常是相同的?
解决方案
这实际上取决于您将如何使用它 - 在第一个解决方案中,您将无法选择元素 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 (..., ..., ...);
请参阅数据模型检查最佳实践文档中的“检查集合类型的使用”部分。
推荐阅读
- dataweave - Dataweave 错误“类型 `Array` 和 `Number` 无法比较
- javascript - 表单控件选项未在移动设备中显示
- playwright-python - 在剧作家 python 中解决拖放问题
- spring - 使用 2 个表 Spring Security 进行身份验证
- reactjs - 处理自定义 SWR 挂钩中的错误
- c# - 如何在 c# 中将字符串值从一种形式传递到另一种形式?
- flask - 如何创建与 flask_socketio 和 telebot 的聊天?
- python - Tensorflow 2D 矩阵乘法返回矩阵产品列表
- python - 我可以抓取网站以识别其下的标题和文本吗?
- c - 我应该缩写库中的变量和函数名称吗?