2015-05-25 4 views
3

Я читал на Кассандре, я сделал несколько уроков и поиграл с CQL, но теперь, когда мне нужно разработать схему, у меня возникли трудности.Как смоделировать несколько отношений «многие-многие» в Кассандре?

Я пытаюсь создать схему, которая будет обрабатывать следующий прецедент. Мне нужно следить за рабочими, которые посещают собрания, и те темы, которые они обсуждают на этих встречах. Таким образом, на собрании могут присутствовать несколько сотрудников, на каждой встрече обсуждаются несколько тем, и каждый рабочий может создавать несколько тем. Эти поля данных:

работник: работник ID, работник Имя

Встреча: Встреча ID, название встречи, Встреча Время

Тема: Тема ID, Название темы, Создатель

мне нужно запросов, чтобы увидеть:

  1. , который посещает собрание?
  2. Какие встречи с работником посещали в прошлом?
  3. Какие темы создал рабочий?
  4. Какие встречи обсуждали конкретную тему?

Итак, как должна выглядеть схема, чтобы справиться с этим? Я чувствую, что это не должно быть так сложно, но я не могу понять, когда я начинаю делать таблицы.

ответ

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 окончательном порядке, поэтому я определю конкретный порядок и порядок сортировки (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) 

Обратите внимание, что данные были денормализованные, а некоторые значения столбцов появляются избыточность. Если вы решите, что вам все еще нужны таблицы сущностей для таких вещей, как рабочий, все в порядке. Но еще раз спросите себя, как часто и как именно вы планируете запрашивать эти таблицы. Последние два решения должны быть легко разрешены с помощью аналогичного подхода.

+1

Спасибо, это было именно то, что мне нужно было увидеть. Я пытался применить реляционную модель к Cassandra, и она просто не работала. Но я думаю, что сейчас нахожусь на борту с идеей создания нескольких таблиц, которые копируют данные, чтобы создавать нужные мне запросы. Большое спасибо, я ценю вашу помощь. – user2800390

+0

@ user2800390 Нет проблем. Рад, что смог помочь! – Aaron

+0

Итак, @ BryceAtNetwork23 Посмотрев на ваше решение, у меня есть один последний вопрос для вас. Я заметил, что в обеих таблицах есть столбец с именем «имя собрания» и что он не является первичным ключом в любом из них. Теперь, если мне нужно изменить значение «meetingname» «Wake Mr. Weyland» на «Kill aliens», тогда мне понадобятся первичные ключи каждой таблицы, которые содержат «имя собрания» правильно? Не существует способа связать их, так что изменение одного значения меняет их все, правильно ли я понимаю это? – user2800390

Смежные вопросы