我们正在尝试删除一个包含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>
所以我很好奇,在这里,哪一个是与性能相关的首选方案,或者两者大体相同?
1条答案
按热度按时间cu6pst1q1#
这实际上取决于您将如何使用它-在第一个解决方案中,您将无法选择元素
cid
,因为要访问set
元素,您需要指定完整的udt值和所有字段。更好的解决方案如下,假设只有一个集合列:
在这种情况下:
通过指定完整的主键,可以轻松地选择单个元素。从中选择单个元素的能力
map
只有Cassandra4.0版本。见Cassandra-7396。在此之前,即使需要一个元素,也需要返回完整的Map,这将限制Map的大小您甚至可以使用范围查询来选择值的范围
您可以通过只指定分区键来获取所有值(
pk
在本例中)通过执行以下操作可以选择多个非连续值
select * from test where pk = ... and cid in (..., ..., ...);
请参阅数据模型检查最佳实践文档中的“检查集合类型的使用”部分。