从RDBMS角度看mongoDB中的产品目录存储

时间:2011-08-29 16:55:42

标签: sql mongodb nosql

我的产品页面的网址为http://host/products/{id}/{seo-friendly-url},其中“seo-friendly-url”部分可能类似于category/subcategory/product

产品控制器获取具有指定ID的产品,然后确保后面的URL对于产品是正确的 - 如果不是用户被重定向到适当的URL(商店中的所有URL都是正确生成的) ,重定向只是为了在用户输入错误的情况下维护规范网址,或者自Google抓取网址后更改网址等)。该ID可确保快速查找产品,最后的部分可确保关键字进入网址。

为了检查URL,我有一个SQL视图,它利用递归公用表表达式将产品URL块与其父类别URL的URL连接在层次结构中(通常只有3深)。

我最近遇到了面向文档的存储,我发现它在各种情况下非常有用(例如,我的产品实体目前在不同的表中都有标签和多种价格和属性等)。

关于我的问题 - 如何在mongoDB中实现上述功能,还是有更好的方法来考虑它?天真的方法是单独检索层次结构中的每个类别,但我认为这样会很慢。

相关:我在文档中读到跳过/限制对于大型结果集来说很慢 - 这对于最多可能出现在零售网站类别中的25个产品中的10个页面是否会引人注意?< / p>

2 个答案:

答案 0 :(得分:0)

您可以为名为products的集合建模,其文档如下:

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

获取给定id,category和subcategory的产品的查询类似于:

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

这听起来很简单,但鉴于我对你的问题的理解IMO,这应该是一个好的开始。

对于您的其他问题,可以使用skiplimit修饰符来帮助分页。

答案 1 :(得分:0)

我认为您最好的选择就是将完整的slug存放在产品中。然后,当你得到产品时,只需检查slug是否匹配,如果不匹配,则重定向。现在,权衡的是,如果你想重命名一个类别,你需要做一个批处理工作来查找该类别中的所有产品并更改它们的slu ..好消息是,类别重命名将远不如视图(希望如此),因此您的总负载将会降低。

不确定跳过和限制是如何与此问题相关的,除了它们都涉及mongodb。无论如何25个结果它真的没问题。限制并不慢,事实上如果小于100(默认的第一批量),可以加快速度。跳过可能会损害性能,但只能使其速度变慢,就好像您在没有额外网络流量的情况下获取所有跳过的文档一样。因此,我不会跳过100万个文档,但跳过100会很好。