MongoDB Schema Design сервис заказа
У меня есть следующие объекты Company, User и Order (содержит строки заказа). Пользователь размещает заказы с 1 или более линиями заказов, и они относятся к Компании. Период времени, в течение которого заказы могут быть размещены для этой Компании, составляет всего неделю.
То, что я не уверен в том, где разместить массив заказов, должен ли он быть собственной коллекцией, содержащей ссылку на Пользователя и ссылку на Компанию, или он должен находиться под Компанией, или, наконец, если заказы будут размещены под Пользователь.
Мудрые цифры мне нужно планировать на 50к + в заказах.
В отношении запросов, я, вероятно, в основном буду рассматривать Заказы по компаниям, но мне нужно будет найти Заказы по компаниям для конкретного пользователя.
1 ответ
1) Для людей, пришедших из мира SQL (таких как я), одним из самых сложных знаний о MongoDB является новый стиль проектирования схем. В мире SQL все переходит в третью нормальную форму. Люди приходят к мысли, что существует единственно верный способ разработки их схемы, потому что обычно она есть.
В мире MongoDB нет лучшего дизайна схемы. Точнее, в схеме MongoDB дизайн зависит от того, как приложение будет обращаться к данным.
2) Вот ключевые вопросы, на которые вам нужно ответить, чтобы разработать хорошую схему для MongoDB:
- Сколько данных у вас есть?
- Каковы ваши самые распространенные операции? Будете ли вы в основном вставлять новые данные, обновлять существующие или выполнять запросы?
- Каковы ваши самые распространенные вопросы?
- Сколько операций ввода / вывода вы ожидаете в секунду?
Здесь вы говорите о моделировании отношений "многие к одному":
- Компания -> Пользователь
- Пользователь -> Заказать
- Заказать -> Заказать линии
- Компания -> Заказ
Используя SQL, вы создадите пару основных / подробных таблиц с отношением первичный ключ / внешний ключ. В MongoDB у вас есть несколько вариантов: вы можете встраивать данные, вы можете создавать связанные отношения, вы можете дублировать и денормализовать данные, или вы можете использовать гибридный подход.
Правильный подход будет зависеть от множества деталей о сценарии использования вашего приложения, многие из которых вы не предоставили.
3) Это мое лучшее предположение - и это только предположение - относительно хорошей схемы для вас.
а) иметь отдельные коллекции для пользователей, компаний и заказов
Если вы смотрите на 50 000+ заказов, их слишком много, чтобы их можно было вставить в один документ. Наличие их в качестве отдельной коллекции позволит вам ссылаться на них как из документов Компании, так и из документов Пользователя.
б) Иметь массив ссылок на документы Заказа в документах Компании и Пользователя. Это делает запрос "Найти все заказы для этой компании" запросом с одним документом.
c) Если ваш шаблон запроса поддерживает это, вы также можете иметь дублирующую ссылку из заказов обратно на компанию-владельца и / или пользователя.
d) Предполагая, что строки заказа уникальны для отдельного Заказа, вы должны встроить Строки заказа в массив в документах Заказа.
e) Если строки вашего заказа относятся к отдельным продуктам, вы можете захотеть иметь отдельную коллекцию продуктов и включить ссылку на документ продукта в поддокументе строки заказа.
4) Вот несколько хороших общих ссылок на дизайн схемы MongoDB.
Презентации MongoDB:
- http://www.10gen.com/presentations/mongosf2011/schemabasics
- http://www.10gen.com/presentations/mongosv-2011/schema-design-by-example
- http://www.10gen.com/presentations/mongosf2011/schemascale
Вот пара книг о дизайне схемы MongoDB, которые, я думаю, вы найдете полезными:
- http://www.manning.com/banker/ (MongoDB в действии)
- http://shop.oreilly.com/product/0636920018391.do
Вот несколько примеров схем:
Обратите внимание, что книга "MongoDB в действии" включает в себя пример схемы для приложения электронной коммерции, которая очень похожа на то, что вы пытаетесь создать - я рекомендую вам ее проверить.