Mongodb或MySQL中的高级查询

时间:2012-05-17 14:10:03

标签: php mysql json mongodb

我正在开发一个小应用程序,并且因为使用MongoDB或MySQL进行内容存储而感到疲惫。

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

我们需要根据搜索或过滤器返回30个对象...

  • 这些物体中有30%需要是动物
  • 其中30%需要成为一张图片
  • 20%需要成为视频
  • 15%需要成为产品
  • 5%需要成为游戏

但是,30%的动物返回,让我们说X数量必须是恐龙,X必须是猴子,X必须是鸟类。

对于图像也是如此,从30%的图像中,返回的对象必须是不同子类别(可爱,设计,时尚,食品,音乐等)的相等部分。

如果这对任何人都有意义,你会建议什么路由去返回这些对象的内容数据库,有些东西告诉我用MongoDB更容易实现,但我不完全确定。

Mongo或MySQL中的任何建议和查询示例都非常有用并且非常感谢。

1 个答案:

答案 0 :(得分: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" } } } );

使用4store的SPARQL查询可能类似于:

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

您能详细说明您的数据吗?

相关问题