我正在开发一个小应用程序,并且因为使用MongoDB或MySQL进行内容存储而感到疲惫。
我有大约2000个DB内容片段,其中包含大量描述内容的元数据(id,名称,类型,描述性标签,颜色等,日期,视图等),现在我们需要返回一个数组符合特定条件的对象,例如:
我们需要根据搜索或过滤器返回30个对象...
但是,30%的动物返回,让我们说X数量必须是恐龙,X必须是猴子,X必须是鸟类。
对于图像也是如此,从30%的图像中,返回的对象必须是不同子类别(可爱,设计,时尚,食品,音乐等)的相等部分。
如果这对任何人都有意义,你会建议什么路由去返回这些对象的内容数据库,有些东西告诉我用MongoDB更容易实现,但我不完全确定。
Mongo或MySQL中的任何建议和查询示例都非常有用并且非常感谢。
答案 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>
}
您能详细说明您的数据吗?