5

我们正在开发要部署在 AppHarbor 上的 ASP.NET MVC 3 网站。该网站上将至少有 10,000 种产品。用户可以基于标记系统搜索产品(例如搜索“color=blue”加“size=10”加“category=whatever”)。因此,该系统将重读数据库而轻重写入,我们主要关心的问题之一是保持搜索功能极快。为此,我们还想合并一些结果缓存。

  1. 我们认为这是使用 NoSQL 数据库的好用例是对还是错(我们一直在研究 MongoDB,将托管在https://mongohq.com上)?

  2. 如果我们确实使用 MongoDB,我们应该研究哪些缓存策略?

干杯!

4

2 回答 2

8

MongoDB 非常适合标记,因为它具有多键功能

例如,假设您像这样创建产品文档

{
    _id : 1,
    name : "Widget",
    tags: [
        {color : "blue"},
        {size : 10},
        {foo : "bar"}
    ]
}

然后,您可以在 tags 数组上创建索引,并且每个项目都将被索引。因此,要查找所有蓝色的产品,您可以这样查询:

db.Products.find({tags : {color : "blue"}});

这样做的好处是每个项目都可以有一组完全不同的标记“属性”,并且查询将能够使用索引——有些可能有颜色和大小,有些可能有重量和高度。

关于缓存,在 MongoDB 中,重要的是要有足够的 RAM 来将工作集保存在内存中(足以保存所有访问的数据和索引)。这样,数据将保留在内存中,从而非常快速地进行查询。因此,您可能不需要顶部的缓存技术。

于 2011-04-20T08:08:11.380 回答
2

虽然 MongoDB 会满足您的需求,但我会认真考虑研究 Lucene 或 Solr,它们天生就更擅长搜索。它们提供了非常强大的搜索功能,例如分面搜索和“您的意思是……”类型的功能,MongoDB 没有而且可能永远不会这样做。

您今天可能不需要这种功能,但请花一点时间考虑一下您将来是否可能需要这种功能。

于 2011-04-21T01:03:08.593 回答