gpt4 book ai didi

cassandra - 如何在 Cassandra 中对多个 "many to many"关系进行建模?

转载 作者:行者123 更新时间:2023-12-02 22:22:12 25 4
gpt4 key购买 nike

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

我正在尝试创建一个能够处理以下用例的架构。我需要跟踪参加 session 的工作人员以及他们在这些 session 中讨论的主题。因此,一个 session 可以有多个工作人员参加,每次 session 讨论多个主题,每个工作人员可以创建多个主题。这些是数据字段:

worker : worker ID、 worker 姓名

session : session ID、 session 名称、 session 时间

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

我需要查询才能看到:

  1. 谁正在参加 session ?
  2. 员工过去参加过哪些 session ?
  3. 工作人员创建了哪些主题?
  4. 哪些 session 讨论了特定主题?

那么架构应该是什么样子来处理这个问题呢?我觉得这不应该那么难,但当我开始制作表格时,我无法让它有意义。

最佳答案

请务必记住,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);

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

在两个表中插入一些行后,我可以查询特定 session 的出席情况,如下所示:

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)

现在,如果我想查看特定工作人员参加了哪些 session ,我还可以通过 workerID 进行查询:

aploetz@cqlsh:stackoverflow2> SELECT workername, meetingtime, meetingid, meetingname
FROM meetingsbyworker WHERE workerid=77cb9f64-3cb8-43f9-ab0c-b907b01c4404;

workername | meetingtime | meetingid | meetingname
------------+--------------------------+--------------------------------------+--------------------
Vickers | 2093-12-29 13:01:00-0600 | c7cea773-4c99-445f-928d-5b8a511c843b | Wake Mr. Weyland
Vickers | 2093-12-26 18:22:00-0600 | 3ea1282b-a465-4626-bd76-c65dd17b9f26 | Head Examination
Vickers | 2093-12-25 08:08:00-0600 | 031e457b-2660-448b-a1d5-68c6cce3a820 | Project Prometheus

(3 rows)
aploetz@cqlsh:stackoverflow2> SELECT workername, meetingtime, meetingid, meetingname
FROM meetingsbyworker WHERE workerid=939657c2-e0cb-4a61-87d8-2a1739161d2a;

workername | meetingtime | meetingid | meetingname
------------+--------------------------+--------------------------------------+------------------
Ford, Dr. | 2093-12-29 13:01:00-0600 | c7cea773-4c99-445f-928d-5b8a511c843b | Wake Mr. Weyland
Ford, Dr. | 2093-12-26 18:22:00-0600 | 3ea1282b-a465-4626-bd76-c65dd17b9f26 | Head Examination

(2 rows)

请注意,数据已被非规范化,并且某些列值出现冗余。如果您决定仍然需要实体表来处理诸如 worker 之类的事情,那也可以。但再次问问自己,您计划查询这些表的频率和具体方式。通过采取类似的方法,后两个问题应该很容易解决。

关于cassandra - 如何在 Cassandra 中对多个 "many to many"关系进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com