Хранение каталога товаров в mongoDB с точки зрения RDBMS - PullRequest
0 голосов
/ 29 августа 2011

У меня есть страница продукта с URL-адресом в форме http://host/products/{id}/{seo-friendly-url}, где часть "seo-friendly-url" может выглядеть примерно так: category/subcategory/product.

Контроллер продуктов получает продукт с указанным идентификатором и затем гарантирует, что следующий URL-адрес является правильным для продукта - если это не так, пользователь перенаправляется на соответствующий URL-адрес (хотя все URL-адреса в магазине генерируются правильно, хотя перенаправление - это просто сохранение канонического URL-адреса в случае ошибочного ввода пользователем или изменения URL-адреса после его сканирования Google и т. д.). Идентификатор обеспечивает быстрый поиск продукта, а часть в конце обеспечивает переход ключевых слов в URL.

Чтобы проверить URL, у меня есть представление SQL, в котором используется рекурсивное общее табличное выражение для объединения фрагмента URL продукта с URL-адресами URL его родительской категории по всей иерархии (как правило, только 3).

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

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

Связанный: я прочитал в документах, что пропуск / лимит для медленен для больших наборов результатов - будет ли это заметно для максимум, скажем, 10 страниц 25 продуктов, каждая из которых может присутствовать в категории розничных веб-сайтов?

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

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

Не уверен, как пропуск и лимит связаны с этим вопросом, за исключением того, что оба они включают mongodb. Во всяком случае для 25 результатов это действительно не проблема. Предел не медленный и фактически может ускорить процесс, если он меньше 100 (размер первой партии по умолчанию). Пропуск может ухудшить производительность, но только сделав ее такой медленной, как если бы вы выбирали все пропущенные документы без дополнительного сетевого трафика. Поэтому я бы не пропустил 1 миллион документов, но пропустить 100 было бы хорошо.

0 голосов
/ 29 августа 2011

Вы можете смоделировать коллекцию с именем products, с документом, подобным следующему:

product:{id:someId,category:someCategory,subcategory:someSubCategory,productSlug:somenameslug}

Запрос на получение продукта с учетом идентификатора, категории и подкатегории будет выглядеть примерно так:

db.products.find({id:123,category:cat,subCategory:subcat})

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

Для вашего другого вопроса есть модификаторы skip и limit, которые помогут с разбиением на страницы.

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