5

認めるのは少し恥ずかしいのですが、非リレーショナルな世界でデータを設計する方法を概念化するのに苦労しています。特に、ほとんどのドキュメント/KV ストアの機能はわずかに異なります。

具体的な例から学びたいのですが、CouchDB/Redis/MongoDB/Riak/etc を使用したブログなど、どのように設計するかについて話し合っている人を見つけることができませんでした。

私が重要だと思ういくつかの質問があります:

  1. 非正規化する必要があるデータのビット (たとえば、タグはおそらくドキュメントと共に存在しますが、ユーザーについてはどうでしょうか)
  2. ドキュメント間をどのようにリンクしますか?
  3. 集計ビュー、特に並べ替えが必要なビュー (ブログ インデックスなど) を作成する最善の方法は何ですか?
4

3 に答える 3

3

まず、ドキュメントストアではなくKey-Valueストアであるため、リストからredisを削除することをお勧めします。RiakもKey-Valueストアですが、Rippleのようなライブラリを備えたドキュメントストアにすることもできます。

簡単に言うと、ドキュメントストアを使用してアプリケーションをモデル化するには、次のことを理解する必要があります。

  1. 独自のドキュメントに保存し、それに関連する別のドキュメントを持つデータ。そのドキュメントが他の多くのドキュメントで使用される場合は、それを独自のドキュメントでモデル化するのが理にかなっています。また、ドキュメントのクエリについても考慮する必要があります。頻繁にクエリを実行する場合は、埋め込まれたドキュメントをクエリするのが難しいため、独自のドキュメントに保存することをお勧めします。
    • たとえば、複数のブログインスタンスがあるとすると、記事がブログドキュメント内に埋め込まれている場合でも、ブログと記事は独自のドキュメントに含まれている必要があります。
    • もう1つの例は、ユーザーとロールです。これらのために別の文書を用意することは理にかなっています。私の場合、ユーザーに対してクエリを実行することがよくありますが、それが独自のドキュメントとして分離されていると簡単です。
  2. 別のドキュメント内に保存(埋め込み)するデータ。そのドキュメントが1つのドキュメントのみに属している場合は、別のドキュメント内に保存するのが適切なオプションである可能性があります。

    • コメントは、別のドキュメント内に埋め込む方が理にかなっている場合があります

    { article : { comments : [{ content: 'yada yada', timestamp: '20/11/2010' }] } }

    考慮したいもう1つの注意点は、埋め込みドキュメントのサイズがどれだけ大きくなるかです。これは、mongodbでは埋め込みドキュメントの最大サイズが5MBであるためです。

  3. どのデータをプレーン配列にする必要がありますか。例えば:
    • タグは配列として保存するのが理にかなっています。{ article: { tags: ['news','bar'] } }
    • または、複数のIDを保存する場合、つまり複数のロールを持つユーザー{ user: { role_ids: [1,2,3]}}

これは、ドキュメントストアを使用したモデリングの概要です。幸運を。

于 2010-11-17T22:00:03.377 に答える
1
  1. どのオブジェクトを独立させるべきか、どのオブジェクトを他のオブジェクトの一部として埋め込むべきかを決定することは、主に読み取り/書き込みのパフォーマンス/労力のバランスの問題です-子オブジェクトが独立している場合、それを更新することは1つのドキュメントのみを変更することを意味しますが、親オブジェクトを読み取るときはIDのみがあり、データを取得するには追加のクエリが必要です。子オブジェクトが埋め込まれている場合、親ドキュメントを読んだときにすべてのデータがそこにありますが、変更を加えるには、そのオブジェクトを使用するすべてのドキュメントを見つける必要があります。

  2. ドキュメント間のリンクはSQLと大差ありません。適切なレコードを見つけるために使用されるIDを保存します。主な違いは、子テーブルをフィルタリングして親IDでレコードを検索する代わりに、親ドキュメントに子IDのリストがあることです。多くの場合、多くの関係では、中央のテーブルではなく、両側にIDのリストがあります。

  3. クエリ機能はプラットフォームによって大きく異なるため、これにアプローチする方法について明確な答えはありません。ただし、原則として、SQLの場合のようにドキュメントを保存してアドホッククエリを後で実行するのではなく、通常、ドキュメントの作成時にビュー/インデックスを設定します。

于 2010-11-18T01:31:54.177 に答える
0

Ryan Batesは、数週間前にmongoidについてスクリーンキャストを作成し、ブログアプリケーションの例を使用しています。http://railscasts.com/episodes/238-mongoidこれは開始するのに適した場所かもしれません。

于 2010-11-17T14:46:45.817 に答える