【问题标题】:How to create an efficient Cassandra Data model?如何创建高效的 Cassandra 数据模型?
【发布时间】:2018-11-17 05:44:11
【问题描述】:

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

  • student_id
  • 学生姓名
  • dob
  • 课程名称

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,它由两列组成:

  • 课程名称
  • student_id

其中 course_name 将是分区键,student_id 将是集群键,如下所示:

创建表 student_by_course_name(course_name text, student_id uuid PRIMARY KEY(course_name, student_id));

当学生改变课程时,问题就出现了。现在我想更新 student_by_course_name 表中的课程名称,但它会引发错误,因为 course_name 列是分区键。如果我错误地使用 Cassandra 数据建模,如何解决或请建议?

【问题讨论】:

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


    【解决方案1】:

    Cassandra 不适合删除数据或就地更新数据。我相信您必须使用批处理语句来保持表同步。

    您可以采取两种方法。第一个是删除现有的学生 ID/课程名称组合。这将创建一个墓碑,但如果它不经常发生,那也没什么大不了的。第二种选择是使用原始表并在课程名称上创建二级索引。这将允许更新和查询课程名称,但随着时间的推移可能无法很好地执行。

    【讨论】:

      【解决方案2】:

      最好的方法确实是 Alex 建议的。删除然后更新。

      您可能需要注意一些问题。

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

      【讨论】:

        【解决方案3】:

        在这种情况下,您必须先删除旧条目,然后将新条目与新课程一起添加到 student_by_course_name。

        你的模型看起来不错

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          • 2018-02-02
          • 2011-12-23
          • 1970-01-01
          • 2015-09-13
          相关资源
          最近更新 更多