Cassandra 集合:CQL 中的集合、列表和映射(附示例)

⚡ 智能摘要

Cassandra 集合使用集合、列表和映射类型在单个列中存储多个值。本页解释了每种类型,创建和填充它们的 CQL 语法,如何更新元素,以及决定何时不适合使用集合的大小限制。

  • 📦 三种类型: 集合存储唯一的无序值,列表保留插入顺序,映射存储键值对。
  • 🔤 设置行为: 元素按排序方式存储,重复项自动删除。
  • 🔢 列表注意事项: 顺序得以保留,但前置和索引操作需要在写入之前进行读取。
  • 🗺️ 地图用途: 映射适用于在设计模式时键值未知的属性。
  • 📏 尺寸限制: 保持集合较小;即使只需要其中一个元素,也会读取整个集合。
  • 🧊 冷冻选项: 冻结的集合以一个值存储,必须全部替换。

Cassandra 收藏集列表地图

是什么 Cassandra 收藏品?

Cassandra 集合是处理任务的好方法。集合中可以存储多个元素。 Cassandra 集合。

  • 集合列单个值不能存储超过 64 KB 的数据。
  • 保持集合较小,以避免查询集合带来的开销,因为即使只需要一个元素,也会读取整个集合。
  • 存储超过 64 KB 的数据意味着只能查询前 64 KB 的数据,这会导致数据丢失。
  • 未冻结的集合大约包含 65,535 个元素,并且每个元素作为一个整体进行读取。

这些限制指向一条规则:集合适合存储与行关联的少量属性,而不是随着使用而不断增长的开放式列表。任何持续增长的内容都应该放在其自身表的聚类列中。

有哪些 Cassandra 系列

主要有三种类型的收藏品 Cassandra 支持:

  1. 列表
  2. 地图

Cassandra 集合集合

集合 (Set) 存储一组元素,查询时返回已排序的元素。

句法

以下是存储教师多个电子邮件地址的 Set 集合的语法。

CREATE TABLE University.Teacher (
    id int,
    Name text,
    Email set<text>,
    PRIMARY KEY (id)
);

例如:

这是以“电子邮件”列作为集合创建的表“教师”的快照。

示例 Cassandra 集合集合

这是在集合中插入数据的快照。

示例 Cassandra 集合集合

INSERT INTO University.Teacher (id, Name, Email)
VALUES (1, 'Guru99', {'abc@gmail.com', 'xyz@hotmail.com'});

无需重写整个集合即可添加或删除单个元素,这是保持集合未冻结的主要优势。

UPDATE University.Teacher SET Email = Email + {'new@guru99.com'} WHERE id = 1;
UPDATE University.Teacher SET Email = Email - {'xyz@hotmail.com'} WHERE id = 1;

Cassandra 清单集合

当元素的顺序很重要时,使用列表。

例如:

这是在“教师”表中添加列表类型列“课程”的快照。

示例 Cassandra 清单集合

ALTER TABLE University.Teacher ADD coursenames list<text>;

这是在“coursenames”列中插入数据的快照。

示例 Cassandra 清单集合

INSERT INTO University.Teacher (id, Name, Email, coursenames)
VALUES (2, 'Hamilton', {'hamilton@hotmail.com'}, ['Data Science']);

这是显示插入后当前数据库状态的快照。

Cassandra 列表集合示例

元素可以添加到末尾或添加到末尾,但添加末尾和按索引更新都需要 Cassandra 首先读取列表,这使得它们比追加列表慢。

UPDATE University.Teacher SET coursenames = coursenames + ['Machine Learning'] WHERE id = 2;
UPDATE University.Teacher SET coursenames = ['Statistics'] + coursenames WHERE id = 2;

Cassandra 地图集

Map 是一种用于存储键值对的集合类型。顾名思义,它将一个事物映射到另一个事物。

例如想将课程名称与其先修课程名称一起保存,可以使用地图集合。

例如:

这是为课程名称及其先修课程名称创建地图类型的快照。

示例 Cassandra 地图集

CREATE TABLE University.Course (
    id int,
    prereq map<text, text>,
    PRIMARY KEY (id)
);

这是在地图集合类型中插入数据的快照。

示例 Cassandra 地图集

INSERT INTO University.Course (id, prereq)
VALUES (1, {'DataScience': 'Database', 'Neural Network': 'Artificial Intelligence'});

只需设置或删除单个条目,而不会影响地图的其他部分。

UPDATE University.Course SET prereq['Robotics'] = 'Linear Algebra' WHERE id = 1;
DELETE prereq['DataScience'] FROM University.Course WHERE id = 1;

集合、列表和映射:如何选择集合

这三种类型看起来可以互换,但在订购保证和更新费用方面有所不同。

方面 列表 地图
订购 按值排序 插入顺序保持不变 按键排序
重复 不允许 允许 独特的钥匙
更新成本 便宜,无需阅读 追加操作成本低;前置和索引更新需要读取操作。 每把钥匙便宜
最适合 标签、电子邮件地址、唯一标签 有序步骤中重复项有意义 具有不可预测键的命名属性

除非顺序确实至关重要,否则最好使用集合而不是列表,因为列表索引操作会创建墓碑标记,并且在并发写入时可能会产生意想不到的结果。 冻结 三个存储中的任何一个都会将其作为一个不可变值存储,这允许集合出现在主键中,但会移除元素级别的更新。

CREATE TABLE University.Enrolment (
    id int,
    tags frozen<set<text>>,
    PRIMARY KEY (id, tags)
);

当集合中的元素超过几十个时,应将其建模为一个单独的表,并将元素作为聚类列,遵循以下方法: Cassandra 数据模型规则对集合内容进行筛选需要索引,这在……中有所介绍。 创建和删除索引 教程。

常见问题

是的,索引一旦存在即可。在创建匹配的 VALUES、KEYS 或 ENTRIES 索引之后,对于集合和列表值使用 CONTAINS,对于映射键使用 CONTAINS KEY。

只有当内部集合被冻结时,例如从文本映射到冻结的文本列表,才能进行此操作。未冻结的集合不能包含另一个集合。

创建新集合时,会先删除所有现有元素,从而写入一个范围墓碑。添加和删除单个元素可以避免这种情况,是更推荐的做法。

根据预期的元素数量和更新模式,AI 可以很好地应用该规则:数量有限且规模较小时,倾向于使用集合;数量无限或查询频繁时,倾向于使用聚类列。

不过,它经常将集合括号与列表括号混淆,并且省略了主键需要冻结的情况。请先针对测试键空间运行生成的语句。

总结一下这篇文章: