Firestore - Какая структура данных лучше всего подходит для моего сценария? - PullRequest
0 голосов
/ 04 октября 2019

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

Настройка:

  1. В моем приложении будет много тестов, в которых будут участвовать пользователи.
  2. Каждый тест будет иметь несколько вопросов.
  3. Каждый вопрос будет иметь несколько ответов, можно выбрать только один.
  4. Каждый пользователь ответит на каждый тест только один раз.

Требования:

  1. Мне нужно хранить ответы для каждого пользователя и иметь возможность создавать отчеты на уровне пользователя.
  2. Мне нужно видеть сводные результаты для каждого теста, для каждого вопроса, числоответов.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 05 октября 2019

Я думаю, начнем с основ, и, надеюсь, повсюду сплоченность. Кажется, что каждая следующая часть работает сама по себе, вы можете обнаружить, что вместе имеет смысл хранить некоторые вещи в документах, а не в своей собственной коллекции, или поддерживать вложенные коллекции, а не корневые коллекции и т. Д.:

  • Каждый тест может иметь свой собственный документ в коллекции тесты .
  • Каждый вопрос (с его потенциальными ответами) может иметь свойсобственный документ в коллекции вопрос .
  • Каждый ответ на вопрос может иметь собственный документ в коллекции ответов , чтобы избежать хранения ответас вопросом.
  • Каждый пользователь, пользователи
  • Ответы каждого пользователя, пользователей / опросов

Вы можете рассмотреть возможность вложения вопросов в тесты, но, возможно, вы захотите оставить их корневыми, чтобы вы могли легко повторно использовать вопросы для нескольких тестов.

Поэтому, возможно, стоит сохранить массив в документе каждого вопроса, для которого тесты будут заданы. n принадлежит.

Затем вы можете выполнить запрос, подобный этому, чтобы получить все вопросы для викторины:

db.collection('questions').where('quizzes','array-contains', quizId)

Это даст вам все вопросы для каждого теста и удовлетворит ваш второй запрос (и 1-й уже удовлетворен).

Вопросы будут приходить с их потенциальными ответами, и я думаю, что каждый должен получить свой собственный идентификатор. Например:

-- question1
----- "Do you xyz?"
----- potentialAnswers
--------- { id: xyz123, answer: "Yes" }
--------- { id: wxy456, answer: "No" }

Это позволяет вам брать каждый ответ, который дает пользователь, и запрашивать, есть ли совпадение в вашей базе данных ответов.

Мне это нравитсяпока, потому что это позволяет вам запрашивать все вопросы, и вы получаете все возможные ответы в одном запросе / одном организованном списке. Вы можете переставить потенциальные ответы при их отображении, поэтому «С» на каждом дисплее множественного выбора не обязательно должен быть всегда одним и тем же «С». До тех пор, пока идентификатор совпадает, когда вы идете на сравнение, вы уверены.

Это сравнение может выглядеть так:

db.collection('answers').where('questionId','==', 'question1').where('answerId', '==', 'xyz123')

Если вы получите документ, возвращенный с запросомтаким образом, они ответили правильно.

Для каждого ответа, который дает пользователь, я бы отмечал его в подгруппе каждого пользователя, где quizId - это идентификатор документа. Таким образом, под user1 у них будет коллекция, называемая викторинами.

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

-- user1
----- quizzes
-------- quiz1
----------- progress: 2/25
----------- complete: true
----------- score: 1/2
----------- answers
-------------- { questionId: question1, answer: xyz123, correct: true }
-------------- { questionId: question2, answer: rst456, correct: false }

Для каждого теста, который вы хотите, чтобы пользователь прошел, если документ с таким идентификатором не находится в {userID} / quizzes} с complete = true, он может запустить егоили продолжайте принимать и т. д.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...