パーセンテージの部分はおそらく最も難しいです。これらのパーセンテージを 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>
}
データについて詳しく教えてください。