Подходит ли AWS DynamoDB для приложения сбора и анализа данных? - PullRequest
0 голосов
/ 02 октября 2019

Я создаю простое, скажем, приложение для опросов. У меня есть следующие требования:

User: 
- name 
- surname 
- age

Question: 
- question (text) 
- type 
- author

Answer: 
- value 
- date  

Я хочу, чтобы пользователи задавали вопросы для ответов, и я хочу иметь возможность задавать следующие вопросы:

  • Получать вопросы и ответы пользователя
  • Получить вопрос и его ответы
  • Получить вопросы и ответы пользователя по (или где) типу
  • Получить ответы на вопросы по значению (или по значению)
  • Количествоответы на вопрос
  • Получите ответы на вопрос по возрасту пользователя
  • Получите ответы на вопросы по времени (по пользователю или по всем вопросам)

Пока я подошелсо следующим решением:

enter image description here

Итак, здесь ключ разделения - это идентификатор, а ключ сортировки - тип

Итак, первая проблемапервое требование:

  • Получить вопросы и ответы пользователя

Должен ли я добавить еще один тип, который будет user?

Теперь как:

  • получить вопрос и ответы на него?

Я могу запросить id = 1 and type starts with question, но затем я могу получить много ненужных user записей.

Теперь следующий:

  • получить ответы пользователя на вопросы определенного типа (тип в качестве атрибута вопроса)

  • Как рассчитать одинаковые ответы на вопрос?

IЯ новичок в DynamoDB, поэтому любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Хорошо, поэтому мне понадобилось несколько хороших часов, чтобы выяснить ответ.

Давайте начнем с сущностей и их отношений, вот диаграмма:

enter image description here

Где:

  • USR - Пользователь
  • ANS - Ответ
  • QUE - Вопрос

Как видно из приведенного выше, у меня нет взаимосвязей «многие ко многим», поэтому единственный шаблон, который я буду использовать для извлечения данных, - это шаблон «Первичный ключ (ключ раздела + ключ выбора)».

Если бы у меня было отношение «многие ко многим» в модели, кроме PK + SK, я бы также использовал GSI (Global Secondary Index). GSI также можно использовать для создания другого представления, например, меняя местами PK с SK.

Теперь шаблоны доступа к БД:

enter image description here

Вышеизложенное, к сожалению, не охватывает все шаблоны доступа, еще несколько я могуПредставьте себе:

  • Запрос ответов по возрасту пользователя
  • Запрос ответов на вопрос и вычисление процентаответов по типу (это должно быть рассчитано за пределами DynamoDB?)

А теперь дизайн таблицы БД:

enter image description here

Таким образом, основываясь на шаблонах доступа в таблице шаблонов доступа с этим дизайном, я могу запросить:

  1. Все ответы пользователя на вопрос
    • SELECT PK =USR_1 WHERE SK начинается_with (AR_QUE_2)
  2. Все ответы на все вопросы пользователя
    • SELECT PK = USR_1 WHERE SK начинается_with (AR_QUE) - в этом случае мне придется включить метаданные вопроса (сам вопрос в виде текста) в атрибуты AR_QUE_X_ANS_Y, чтобы мне не приходилось запрашивать таблицу несколько раз, чтобы получить метаданные всех вопросов.
  3. Все ответы на вопрос
    • Выберите PK = QUE_2

Я бы действительнолюблю слышать чье-то мнение по этому вопросу. Я также признателен за то, что в некоторых случаях мне пришлось бы денормализовать данные и вставить информацию метаданных в атрибуты.

Мне все еще очень любопытно, как я могу рассчитать количество ответов по типу на вопрос и рассчитать, например,процент ответов разного типа.

0 голосов
/ 02 октября 2019

Я бы добавил id (uuid, сгенерированный из кода) для каждой таблицы.

Получить вопросы и ответы пользователя

Установить userId как поле в Вопросах и Ответах, а затем установить индекс для этого. Это позволит вам (с двумя отдельными запросами) получить все вопросы и ответы конкретного пользователя.

получить вопрос и ответы на него?

Ответ будет иметь видполе questionId и применяется тот же принцип индекса

получить ответы пользователя на вопросы определенного типа (введите как атрибут вопроса)

Вы можете добавить поле в Answer, которое является questionTypeи фильтр на это. Помните, что схема NoSQL ориентирована на запросы, которые вам нужны, а не на идеальную нормализованную схему.

Как рассчитывать одинаковые ответы на вопрос?

Я предполагаю, что вы имели в видусколько ответов у вопроса. Хорошо, если вы знаете вопрос, просто следуйте "получить вопрос и его ответы?"и выполните .withSelect(Select.COUNT) для запроса

EDIT

User: 
- userId (hash key)
- name 
- surname 
- age

Question: 
- questionId (hash key)
- question (text) 
- type 
- author
- askedByUserId (index - hash key)

Answer: 
- answerId (hash key)
- value 
- date 
- answeredByUserId (index - hash key)
- questionId (index - hash key)

Так что все зависит от того, как вы запрашиваете данные (и, конечно, вы можете в конечном итоге перейти на SQLдаже, noSQL не замена 1: 1). Ссылка просто по идентификатору не является неправильной, я предпочел бы иметь неизменные вопросы и ответы вместо того, чтобы редактировать вопрос каждый раз, когда он получает ответ. Поэтому учтите, что вы не можете использовать объединения и всегда предпочитаете неизменные данные (добавьте новое значение вместо редактирования).

РЕДАКТИРОВАТЬ 2

Для того, чтобы получитьВсе вопросы и ответы от пользователя, создайте и управляйте этой таблицей:

UserItems:
- userId (hash key)
- question (full json of a question, optional)
- answer (full json of a answer, optional)

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

...