我尝试使用this文章来了解来自关系背景的Cassandra中的数据建模。但是,我无法理解其中一个示例。
在示例2用户组:
中CREATE TABLE groups (
groupname text,
username text,
email text,
age int,
PRIMARY KEY (groupname, username)
)
请注意,PRIMARY KEY有两个组件:groupname,即 分区键和用户名,称为群集密钥。 这将为每个组名提供一个分区。特定的 分区(组),行将按用户名排序。 找一个小组 就像执行以下操作一样简单:
SELECT * FROM groups WHERE groupname = ?
然而,我无法理解的是,如果我们要创建一个组,我们将在插入中传递单个组名和相应的用户名。
那么,如何使用select语句检索属于单个组的所有用户?此外,由于组名是主键,因此我们无法添加具有相同组名的更多用户,因为这会导致违规。
答案 0 :(得分:2)
您可以将分区视为数据存储区。它可以包含单行或多行数据。当您读取该数据存储桶时,Cassandra可以非常有效地访问存储桶中的所有行,或者仅通过群集密钥指定的行范围。
分区是Cassandra中的复制单元,因此一个分区存储区中的所有数据都存储在一个节点上(如果使用的复制因子高于一个,则可能在其他节点上有额外的副本)。
但是分区键只是键的一部分。存储桶中的每一行仍然需要具有唯一的主键,因此在该示例中,存储在特定组分区中的每个用户都需要具有不同的用户名。因此,groupname和username的组合需要是唯一的。只要组内的每个用户名不同,您就可以在同一组名下插入更多用户。如果您插入了重复的用户名,那么它将是对该用户名的行的更新,而不是添加一行。