如何创建高效的Cassandra数据模型?

时间:2018-06-07 10:32:20

标签: cassandra spring-data spring-data-cassandra

我是Cassandra的新手并尝试创建一个应用程序。我有一个实体'学生'由4列组成,如下所示:

  • student_id数据
  • student_name
  • dob
  • COURSE_NAME
  
    

创建表学生(student_id uuid,student_name文本,dob日期,course_name文本,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 个答案:

答案 0 :(得分:1)

在这种情况下,您必须先删除旧条目,然后使用新课程向student_by_course_name添加新条目。

你的模特看起来不错

答案 1 :(得分:1)

Cassandra不是最好的删除数据或就地更新数据。我相信你必须使用批处理语句来保持表同步。

您可以采取两种方法。第一种是删除现有的学生ID /课程名称组合。这将创建一个墓碑,但如果它不经常发生,它将不会是一个大问题。第二种选择是使用原始表并在课程名称上创建二级索引。这将允许更新和查询课程名称,但可能不会随着时间的推移而预先形成。

答案 2 :(得分:1)

最好的方式确实是亚历克斯建议的。删除然后更新。

您可能需要注意几个问题。

  1. 如果您的课程有很多学生,它会生成大分区(对于这个特定情况可能不是问题)
  2. 删除条目会导致逻辑删除,因此您应该准备好处理它们(例如:如果您认为在表格中设置了unchecked_tombstones,则使用低GC_GRACE)