Важно помнить, что моделирование данных 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
окончательном порядке, поэтому я определю конкретный порядок и порядок сортировки (DESC
).
Вставив несколько строк в обеих таблицах, я могу запросить посещаемость для конкретной встречи, как это:
[email protected]: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)
[email protected]: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
:
[email protected]: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)
[email protected]: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)
Обратите внимание, что данные были денормализованные, а некоторые значения столбцов появляются избыточность. Если вы решите, что вам все еще нужны таблицы сущностей для таких вещей, как рабочий, все в порядке. Но еще раз спросите себя, как часто и как именно вы планируете запрашивать эти таблицы. Последние два решения должны быть легко разрешены с помощью аналогичного подхода.
Спасибо, это было именно то, что мне нужно было увидеть. Я пытался применить реляционную модель к Cassandra, и она просто не работала. Но я думаю, что сейчас нахожусь на борту с идеей создания нескольких таблиц, которые копируют данные, чтобы создавать нужные мне запросы. Большое спасибо, я ценю вашу помощь. – user2800390
@ user2800390 Нет проблем. Рад, что смог помочь! – Aaron
Итак, @ BryceAtNetwork23 Посмотрев на ваше решение, у меня есть один последний вопрос для вас. Я заметил, что в обеих таблицах есть столбец с именем «имя собрания» и что он не является первичным ключом в любом из них. Теперь, если мне нужно изменить значение «meetingname» «Wake Mr. Weyland» на «Kill aliens», тогда мне понадобятся первичные ключи каждой таблицы, которые содержат «имя собрания» правильно? Не существует способа связать их, так что изменение одного значения меняет их все, правильно ли я понимаю это? – user2800390