我是Cassandra的新手并试图创建一个应用程序 . 其中我有一个实体'学生'由4列组成,如下所示:
-
student_id
-
student_name
-
dob
-
course_name
create table student(student_id uuid,student_name text,dob date,course_name text,PRIMARY KEY(student_id));
我必须按course_name搜索学生 . 现在根据Cassandra数据建模,按课程名称搜索学生我需要创建另一个表作为student_by_course_name,它由两列组成:
-
course_name
-
student_id
其中course_name将是分区键,student_id将是群集键,如下所示:
create table student_by_course_name(course_name text,student_id uuid PRIMARY KEY(course_name,student_id));
当学生改变他的课程时会出现问题 . 现在,我想更新student_by_course_name表中的课程名称,但由于course_name列是分区键,因此会引发错误 . 如何解决这个问题或者请问如果我错误地使用Cassandra数据建模?
3 回答
在这种情况下,您必须先删除旧条目,然后使用新课程向student_by_course_name添加新条目 .
你的模型很好看
确实如Alex建议的那样,最好的方法 . 删除然后更新 .
您可能需要注意几个问题 .
如果您的课程有很多学生,它将生成大分区(对于这个特定情况可能不是问题)
删除条目将导致逻辑删除,因此您应该准备好处理它们(例如:如果您认为将在表中设置unchecked_tombstones,将使用低GC_GRACE)
Cassandra不是最好的删除数据或就地更新数据 . 我相信你必须使用批处理语句来保持表同步 .
你可以采取两种方法 . 第一种方法是删除现有的学生ID /课程名称组合 . 这将创建一个墓碑,但如果它不经常发生,它将不会是一个大问题 . 第二种选择是使用原始表并在课程名称上创建二级索引 . 这将允许更新和查询课程名称,但可能不会随着时间的推移而预先形成 .