我如何模拟多个"多对多"卡桑德拉的关系?

时间:2015-05-25 19:20:49

标签: cassandra schema nosql

我一直在阅读Cassandra,我已经完成了一些教程并使用了CQL,但现在是时候设计一个架构我遇到了一些困难。

我试图创建一个可以处理以下用例的模式。我需要跟踪参加会议的工作人员以及他们在这些会议中讨论的主题。因此,会议可以让多个工作人员参加,每次会议都会讨论多个主题,每个工作人员都可以创建多个主题。这些是数据字段:

工作人员:工作人员ID,工作人员姓名

会议:会议ID,会议名称,会议时间

主题:主题ID,主题名称,创建者

我需要查询才能看到:

  1. 谁正在参加会议?
  2. 工人过去参加过哪些会议?
  3. 工人创建了哪些主题?
  4. 哪些会议讨论了某个特定主题?
  5. 那么架构应该如何处理呢?我觉得这不应该那么难,但是当我开始制作餐桌时我无法理解这一点。

1 个答案:

答案 0 :(得分:4)

记住Cassandra数据建模是一种查询驱动的练习非常重要。由于您要完成上述四个查询,因此最终可能会创建四个表:每个查询需要一个表。

我希望你能够学习,所以我不会为你做这一切。但这是我如何解决查询#1和#2。对于#1,我会创建一个这样的表:

CREATE TABLE meetingAttendance (
  meetingID uuid,
  meetingName text,
  meetingTime timestamp,
  workerID uuid,
  workerName text,
  PRIMARY KEY ((meetingID),workerName));

我将meetingID作为分区键,然后按workerName进行集群,以便它们按顺序返回。

对于查询#2,我将创建一个如下查询表:

CREATE TABLE meetingsByWorker (
  workerID uuid,
  workerName text,
  meetingID uuid,
  meetingName text,
  meetingTime timestamp,
  topicID uuid,
  topicName text,
  PRIMARY KEY ((workerID),meetingTime))
WITH CLUSTERING ORDER BY (meetingtime DESC);

当我们查询特定工作人员参加过的会议时,我会在workerID上进行分区。由于会议是基于时间的,因此按meetingTime对它们进行排序是有意义的。默认情况下,它们排序为ASC结束顺序,但历史数据通常以DESC结束顺序查看,因此我将定义特定的CLUSTERING ORDER和排序方向({{1 }})。

将两行插入两个表后,我可以查询特定会议的出席情况,如下所示:

DESC

现在,如果我想查看特定工作人员参加过哪些会议,我也可以通过aploetz@cqlsh:stackoverflow2> SELECT * FROM meetingattendance WHERE meetingid=031e457b-2660-448b-a1d5-68c6cce3a820; meetingid | workername | meetingname | meetingtime | workerid --------------------------------------+---------------+--------------------+--------------------------+-------------------------------------- 031e457b-2660-448b-a1d5-68c6cce3a820 | David | Project Prometheus | 2093-12-25 08:08:00-0600 | b83cbec4-95e5-4457-b037-c28c51d00418 031e457b-2660-448b-a1d5-68c6cce3a820 | Holloway, Dr. | Project Prometheus | 2093-12-25 08:08:00-0600 | d28b4ee8-b1b9-401a-88d4-bc6b9727d712 031e457b-2660-448b-a1d5-68c6cce3a820 | Janek, Capt. | Project Prometheus | 2093-12-25 08:08:00-0600 | ebccf3ba-c1d2-4503-b717-897c7e89d968 031e457b-2660-448b-a1d5-68c6cce3a820 | Shaw, Dr. | Project Prometheus | 2093-12-25 08:08:00-0600 | c0e3e560-2332-4a46-9fdf-68bdb31abcb2 031e457b-2660-448b-a1d5-68c6cce3a820 | Vickers | Project Prometheus | 2093-12-25 08:08:00-0600 | 77cb9f64-3cb8-43f9-ab0c-b907b01c4404 (5 rows) aploetz@cqlsh:stackoverflow2> SELECT * FROM meetingattendance WHERE meetingid=c7cea773-4c99-445f-928d-5b8a511c843b; meetingid | workername | meetingname | meetingtime | workerid --------------------------------------+------------+------------------+--------------------------+-------------------------------------- c7cea773-4c99-445f-928d-5b8a511c843b | David | Wake Mr. Weyland | 2093-12-29 13:01:00-0600 | b83cbec4-95e5-4457-b037-c28c51d00418 c7cea773-4c99-445f-928d-5b8a511c843b | Ford, Dr. | Wake Mr. Weyland | 2093-12-29 13:01:00-0600 | 939657c2-e0cb-4a61-87d8-2a1739161d2a c7cea773-4c99-445f-928d-5b8a511c843b | Vickers | Wake Mr. Weyland | 2093-12-29 13:01:00-0600 | 77cb9f64-3cb8-43f9-ab0c-b907b01c4404 c7cea773-4c99-445f-928d-5b8a511c843b | Weyland | Wake Mr. Weyland | 2093-12-29 13:01:00-0600 | 306955b8-c7ee-4350-8aa4-4c5d64487d74 (4 rows) 查询:

workerID

请注意,数据已经非规范化,并且某些列值显示为冗余。如果您决定仍然需要像工人这样的实体表,那也没关系。但是,请再次问问自己,您是否经常以及如何计划查询这些表格。通过采用类似的方法,最后两个应该很容易解决。