我们正在开发一个部署在AppHarbor上的ASP.NET MVC 3网站。该网站上至少有10,000种产品。用户可以基于标记系统搜索产品(例如,搜索“color = blue”加上“size = 10”加上“category = whatever”)。因此,这个系统将在数据库读取和写入时点亮,我们主要关心的一个问题是保持搜索功能的速度极快。为此,我们还希望结合一些缓存结果。
我们认为这是一个使用NoSQL数据库的好用例(我们一直在关注MongoDB,要托管在https://mongohq.com上)是对还是错?
如果我们使用MongoDB,我们应该研究哪些缓存策略?
干杯!
答案 0 :(得分:7)
MongoDB非常适合标记,因为它具有multikeys功能
e.g。假设您创建了这样的产品文档
{
_id : 1,
name : "Widget",
tags: [
{color : "blue"},
{size : 10},
{foo : "bar"}
]
}
然后,您可以在tags数组上创建索引,并为每个项目编制索引。因此,要找到所有蓝色的产品,您可以这样查询:
db.Products.find({tags : {color : "blue"}});
关于这个的好处是每个项目都可以有一组完全不同的标签“属性”,查询将能够使用索引 - 有些可能有颜色和大小,有些可能有重量和高度。
关于缓存,在MongoDB中,有足够的RAM来保存你的工作集在内存中是很重要的(足以容纳所有访问的数据和索引)。这样,数据将保留在内存中,使查询非常快速。因此,您可能不需要顶部的缓存技术。
答案 1 :(得分:1)
虽然MongoDB会做你想要的,但我会认真考虑研究Lucene或Solr,它们在搜索方面本质上更好。它们提供了非常强大的搜索功能,例如分面搜索和“你是不是......”类型的功能,MongoDB不会做,也可能永远不会。
您今天可能不需要这种功能,但请花点时间考虑一下您将来可能需要的功能。