我一直在阅读Cassandra,我已经完成了一些教程并使用了CQL,但现在是时候设计一个架构我遇到了一些困难。
我试图创建一个可以处理以下用例的模式。我需要跟踪参加会议的工作人员以及他们在这些会议中讨论的主题。因此,会议可以让多个工作人员参加,每次会议都会讨论多个主题,每个工作人员都可以创建多个主题。这些是数据字段:
工作人员:工作人员ID,工作人员姓名
会议:会议ID,会议名称,会议时间
主题:主题ID,主题名称,创建者
我需要查询才能看到:
那么架构应该如何处理呢?我觉得这不应该那么难,但是当我开始制作餐桌时我无法理解这一点。
答案 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
请注意,数据已经非规范化,并且某些列值显示为冗余。如果您决定仍然需要像工人这样的实体表,那也没关系。但是,请再次问问自己,您是否经常以及如何计划查询这些表格。通过采用类似的方法,最后两个应该很容易解决。