0

私は NoSQL テクノロジを調べており、MongoDB、Riak、および Neo4j について少し調べました。

関連エンティティの条件に基づいてデータをトラバースまたは取得するという問題を実際に処理できるものがあるかどうかを尋ねています。

tags テーブル [id,title,created]、posts テーブル [id,title,body]、posts_tags テーブル [post_id,tag_id] があるとします。

2012 年 8 月 5 日より前に作成されたタグを含む投稿を返したいです。SQL の世界では簡単ですが、この問題は NoSQL テクノロジを使用して解決できますか?

私は上記の NoSQL オプションに限定されません。誰かが他のエンジンに関する推奨事項を持っている場合、それは最も歓迎されます。

私は、この問題が NoSQL の世界で解決できるかどうか、またどのエンジンがその種の問題の解決策をサポートしているかを知りたいと思っています。

質問 2: これらのエンティティは、NoSQL アプローチで正しくモデル化されていますか?

質問 3: NoSQL オプションの 1 つを選択することは、パフォーマンスの点で価値がありますか?それともそれでも遅くなりますか? (200万件の投稿と数千のタグがあるとします)

4

3 に答える 3

0

これら 3 つの NoSQL テクノロジはすべて、タグがすべてポスト レコードに直接含まれる非正規化モデルでパフォーマンスが向上すると思います。問題は、タグが作成された時間を追跡したいことです。これは、タグだけよりも少し面倒ですが、それでも可能です。説明したようにタグ コレクションを作成し、投稿にタグを追加するときに作成時間をコピーすることができます。システムからタグを削除できるようにしたい場合は、もう少し複雑になります。

mongodb (私が最も経験のあるもの) では、次のようなことができます。

投稿コレクションの例:

{
  _id: ...,
  title: "test title",
  body: "body",
  tags: [
    {
      title: "test tag",
      created: ISODate("2012-08-05T02:45:40.575Z")
    },
    { 
      title: "test tag2",
      created: ISODate("2012-08-05T02:47:37.124Z")
    }
  ] 
}

次に、クエリは次のようになります。

db.posts.find({"tags.created":{$gt:new Date("2012/08/05")}});

そして、インデックスをオンにすると、tags.createdそれが高速化されます。

TL;DR: ほとんどの NoSQL テクノロジでテーブルを結合しようとすると、実際にはパフォーマンスが低下します。

neo4j の観点から少し追加するための更新:

私は、neo4j では比較的簡単にタグと投稿を関連付けることができることに気付きました (関係は事実上永続的な結合であるため、結合テーブルは必要ありません)。2012/08/05 未満を検索して、それらのタグに関連する投稿を見つけます。非正規化は必要ありません。私はまだneo4jの専門家ではありませんが、理論的にはこれは高性能です。Cypher では次のようになります。

START post=node(*) 
MATCH post<-[:tagged]-tag 
WHERE tag.created < "2012-08-05" 
RETURN post, tag;

createdWHERE を使用する代わりに、インデックスを作成して START をインデックスに一致させることで、このクエリを高速化できる可能性があります。この例ではcreated、ISO 日付文字列を作成しました。関係タイプはtagged.

于 2012-08-05T02:53:14.207 に答える
0

Couchbase を使用すると、Wes の回答と同じようにタグをインラインで保存できますが、ビュー インデックスを使用して、接頭辞「app」を持つすべてのタグを簡単にクエリできます。たとえば、Apple とアプリケーションを返して適用できます。

この記事では、Couch でのオートコンプリート タグ検索の構築に至った経緯について説明します: http://blog.couchbase.com/typeahead-search-couchdb

少し古いですが、一般的なパターンはまだ適用されます。

于 2012-08-07T21:20:28.710 に答える
0

あなたが言及したように、SQL を使用して問題を解決するのは簡単なので、おそらく NewSQL データベースを検討する必要があります。NoSQL、NewSQL and Beyondを参照してください。

于 2012-08-08T07:40:57.053 に答える