Я думаю, что вы боретесь с отделением моделирования предметной области от моделирования базы данных. Я тоже боролся с этим, когда пробовал MongoDb.
Ради семантики и ясности я собираюсь заменить Groups
словом Categories
По сути, ваша теоретическая модель является отношением «многие ко многим» в том смысле, что каждый Item
может принадлежать Categories
, а каждый Category
может иметь много Items
.
Это лучше всего обрабатывается при моделировании объектов вашего домена, а не в схеме БД, особенно при реализации базы данных документов (NoSQL). В вашей схеме MongoDb вы «подделываете» отношение «многие ко многим», используя комбинацию моделей документов верхнего уровня и встраивание.
Встраивание трудно проглотить для людей, пришедших из бэкэндов персистентности SQL, но является существенной частью ответа. Хитрость заключается в том, чтобы решить, является ли он мелким или глубоким, односторонним или двусторонним и т. Д.
Модели документов верхнего уровня
Поскольку ваши Category
документы содержат некоторые собственные данные и на них ссылается огромное количество Items
, я согласен с вами, что полностью встраивать их в каждый Item
неразумно.
Вместо этого обрабатывайте объекты Item
и Category
как документы верхнего уровня. Убедитесь, что ваша схема MongoDb выделяет таблицу для каждого из них, чтобы у каждого документа был свой ObjectId
.
Следующий шаг - решить, куда и сколько встраивать ... правильного ответа нет, все зависит от того, как вы его используете и каковы ваши амбиции по масштабированию ...
Решения по встраиванию
1. Предметы
Как минимум, ваши Item
объекты должны иметь свойство коллекции для своих категорий. По крайней мере, эта коллекция должна содержать ObjectId
для каждого Category
.
Я бы предложил добавить в эту коллекцию данные, которые вы используете при взаимодействии с Item
чаще всего ...
Например, если я хочу перечислить группу элементов на моей веб-странице в сетке и показать названия категорий, частью которых они являются. Очевидно, что мне не нужно знать все о Category
, но если у меня есть только встроенный ObjectId, потребуется второй запрос, чтобы получить какие-либо подробности об этом.
Вместо этого, что было бы наиболее целесообразно, это встроить свойство Name
категории в коллекцию вместе с ObjectId
, чтобы при возврате Item
теперь можно было отображать имена категорий без другого запроса.
Самое важное, что нужно помнить, это то, что объекты ключа / значения, встроенные в Item
, которые «представляют» Category
, не обязательно должны соответствовать реальной модели документа Category
... Это не ООП или реляционный моделирование базы данных.
2. Категории
В обратном порядке вы можете оставить вложение односторонним и не иметь никакой Item
информации в своих Category
документах ... или вы можете добавить коллекцию для данных элементов, как описано выше (ObjectId
или ObjectId
+ Name
) ...
В этом направлении я лично склонялся бы к тому, чтобы ничего не вставлять ... более чем вероятно, если бы я хотел Item
информацию для своей категории, я хочу ее много, больше, чем просто имя ... и глубокое встраивание документ верхнего уровня (Item) не имеет смысла. Я просто смирился бы с запросом базы данных для коллекции Предметов, где каждый из них обладал ObjectId моей Категории в своей коллекции Категорий.
Фу ... смущает наверняка. Суть в том, что у вас будет некоторое дублирование данных, и вам придется настроить ваши модели для обеспечения максимальной производительности. Хорошая новость заключается в том, что это то, что хорошо умеют MongoDb и другие базы документов ...