2012-05-17 49 views
-1

我正在开发一个小型应用程序,并且因为使用MongoDB或MySQL进行内容存储而被撕毁。Mongo或MySQL中的高级查询

我有大约2000个DB内容片断,它们有大量描述内容(id,名称,类型,描述性标签,颜色等,日期,视图等)的元数据,现在我们需要返回一个数组符合特定条件的,因此,例如对象:

我们需要基于搜索或过滤器返回的30个对象......这些对象的

  • 30%必须是动物的
  • 30%他们需要成为一个图像
  • 20%需要视频
  • 15%必须是产品
  • 5%必须是游戏

但是另外的动物的30%退还,让我们说X量必须恐龙,X必须是猴子,X必须是鸟类。

同样可以说,对于图像,其中从图像的30%,所返回的对象必须是不同的子类别的等份(可爱,设计,时尚,食品,音乐等)

如果这对任何人都有意义,你会建议去哪些内容数据库返回这些对象,有些事告诉我用MongoDB会更容易完成,但我不完全确定。

Mongo或MySQL中的任何建议和查询示例都会非常有帮助和赞赏。

+0

我可以说,MongoDB将更容易查询,因为您可以使用实际代码进行查询。你可以遍历你的类别,你甚至可以使用百分比的对象作为查询的参考 –

+0

谢谢卡维,我想我可以做到这一点。你有没有任何机会有任何你可能会在Mongo中一起扔的简单例子,这样我就可以得到一个更好的主意。 – Sean

回答

0

百分比部分可能是最难的。我想不出在MongoDB或SQL查询中表达这些百分比的好方法。你可能不得不在应用程序端处理这个问题。

除了这个限制,MongoDB应该更适合你。我假设元数据可能会有所不同,因此没有固定的模式。如果元数据属性始终相同,则关系数据库会更好。

我确实看到一些元数据是分层的。动物可以是恐龙,所以那里也有继承。 SQL和MongoDB都不能很好地处理继承。

还有其他的NoSQL选项。 4store是一个三重商店,旨在存储RDF数据。 RDF可以很好地处理层次结构,继承,松散的模式和查询。图形数据库如Neo4j也特别擅长(尽管4store也可以处理图形)。

几个引擎查询范例:

SELECT 
    * 
FROM 
    content 
INNER JOIN 
    classification 
ON 
    classification.content_id = content.id 
INNER JOIN 
    classification as classification2 
ON 
    classification2.content_id = content.id 
WHERE 
    classification.name = 'animal' 
AND 
    classification2.name = 'bird' 

可以使更多的加入更多的分类过滤器。还有其他方法可以实现类似的功能,但这取决于您的数据将如何建模。

MongoDB的查询可能是这样的:

db.content.insert({ data: "foobar", classification: ["animal", "bird", "page"] }); 
db.content.find({ classification: { $all: [ "animal", "bird" ] } }); 

或者,也许是这样的:

db.content.insert({ data: "foobar", type: { main: "animal", sub: "bird" } }); 
db.content.find({ type: { $elemMatch: { main : "animal", sub: "bird" } } }); 

的SPARQL查询与4store可能是这样的:

SELECT 
    ?s ?p ?o 
WHERE { 
    ?s <rdfs:type> <myvocab:bird> 
} 

你能告诉更多关于你的数据?

+0

非常感谢Alexandre,这非常有帮助。数据集基本上是一组产品,其中有大量的元数据作为描述性元素,正如您所说的,存在多个层次关系,并且还有继承。我会看看neo4j,这看起来像是一个完美的解决方案。再次真的很感谢帮助,谢谢! – Sean