2016-07-08 3 views
0

У меня есть сценарий, который я обсуждаю для своего приложения.Что было бы лучше надолго: Создание многих документов в MongoDB или меньше документов с вложенными массивами

Скажем, у меня есть приложение викторина со структурой MongoDB, которая выглядит следующим образом:

{ 
    _id: xxxxxx, 
    userId: xxxx, 
    quizData: [ 
    { 
    name: xxxx, 
    quizId: xxxx, 
    questions: [...] 
    }, 
    { 
    name: xxxx, 
    quizId: xxxx, 
    questions: [...] 
    } 
[...] 
} 

Я разрываюсь между тем, что лучше долгосрочный для моего приложения: пусть каждый пользователь имеет только один документ, и для каждой викторины, которую он создает, он будет добавлен в массив объектов quizData ... ИЛИ ... пусть у каждой пользовательской викторины есть свой собственный документ в MongoDB, где я создаю указанную выше структуру для каждой викторины (очевидно, «quizData» будет содержать только один объект, а не массив из множества).

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

У кого-нибудь есть мысли о том, как лучше всего это сделать? не

ответ

3

Ваш вопрос можно перефразировать в one-to-many relationship with embedded documents VS one-to-many relationship with document references

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

  1. Существует ограничение 16mb размера документа, если пользователь создает тонну викторины, документ для этого пользователя будет превышать предел 16 мб.

  2. В какой-то момент, когда количество викторинов всех пользователей растет в миллиарды, вы можете сделать некоторые операции (например: аналитика, оптимизация и т. Д.) По этим данным викторины, но не испортить данные пользователя ,

0

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

Пример, если ваш шаблон доступа к данным таков, что вы обычно показываете все викторины, связанные с пользователем, каждый раз, когда вы получаете пользователя, вам лучше при встраивании, иначе вам придется присоединиться к этим данным в вашем приложении или использовать $ поиск и т. д., чтобы объединить данные, и это может замедлить работу приложения. Но остерегайтесь ограничений, упомянутых s-hunter.

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