-1

用の小さなアプリケーションを開発していますが、コンテンツ ストレージに MongoDB または MySQL を使用することに悩みました。

コンテンツを説明する多数のメタデータ (ID、名前、タイプ、説明タグ、色など、日付、ビューなど) を持つ約 2000 の DB コンテンツがあり、一致するオブジェクトの配列を返す必要があります。特定の基準、例えば:

検索またはフィルターに基づいて返される 30 個のオブジェクトが必要です...

  • それらのオブジェクトの 30% は動物である必要があります
  • それらの 30% は画像である必要があります
  • 20% は動画である必要があります
  • 15% は製品である必要があります
  • 5% はゲームである必要があります

しかしさらに、返還された動物の 30% のうち、X が恐竜、X がサル、X が鳥であるとしましょう。

画像についても同じことが言えます。画像の 30% から返されるオブジェクトは、さまざまなサブカテゴリ (かわいい、デザイン、ファッション、食べ物、音楽など) の等しい部分である必要があります。

それが誰にとっても理にかなっている場合、これらのオブジェクトを返すコンテンツデータベースに行くためにどのルートを提案しますか.MongoDBでこれを達成する方が簡単だということを教えてくれますが、完全にはわかりません.

Mongo または MySQL のいずれかでの提案とクエリの例は、非常に役に立ち、高く評価されます。

4

1 に答える 1

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>
} 

データについて詳しく教えてください。

于 2012-05-17T15:05:04.913 に答える