1

次のような簡単な例を挙げて、単一のドキュメントとして保存するか、複数のドキュメントとして保存するかについてのガイダンスをお願いします。

class User
{
    public string Id;
    public string UserName;
    public List<Post> Posts;
}

class Post
{
    public string Id;
    public string Content;
}

データが保存されると、特定のユーザーのすべての投稿が必要になる場合があります。特定の条件を満たす複数のユーザーにまたがる投稿が必要な場合があります。

各ユーザーを(投稿が埋め込まれた)ドキュメントとして保存する必要がありますか、それともユーザーと投稿を別々のドキュメントとして保存し、投稿に何らかのIDを含めてユーザーにリンクする方が理にかなっていますか?

では、各ユーザーが組織に属している場合はどうなりますか(私のアプリケーションには数百の組織があります)。

class Organization
{
      public string Id;
      public List<User> users;
}

次に、単一ドキュメントのアプローチを維持する必要がありますか?この場合、組織ごとに1つの巨大なドキュメントを保存します。このドキュメントには、埋め込みユーザーが含まれ、次に埋め込み投稿が含まれますか?

4

1 に答える 1

3

それらは別の文書として保管する必要があります。ユーザー、組織、および投稿は集約エンティティの好例であり、Raven では通常、各集約は独自のドキュメントです。

集約ではないエンティティのみを同じドキュメントにネストする必要があります。たとえば、Post にはList<Comment>. Comment と Post はどちらもエンティティですが、Post だけが集合体です。

代わりに、参照を使用してそれらをモデル化する必要があります。

public class User
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<string> PostIds { get; set; }
}

public class Post
{
    public string Id { get; set; }
    public string Content { get; set; }
}

public class Organization
{
    public string Id { get; set; }
    public List<string> UserIds { get; set; }
}

必要に応じて、必要に応じて一部のデータを参照に非正規化できます。

public class UserRef
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Organization
{
    public string Id { get; set; }
    public List<UserRef> Users { get; set; }
}

ユーザー名を組織ドキュメントに非正規化すると、組織を表示するときに各ユーザー ドキュメントを取得する必要がないという利点があります。ただし、ユーザーの名前が変更されるたびに組織のドキュメントを更新する必要があるという欠点があります。関係を検討するたびに、これの長所と短所を比較検討する必要があります。すべての場合に唯一の正解はありません。

また、データが実際にどのように使用されるかを検討する必要があります。Organization実際には、クラスにユーザー リストがまったく必要ないことに気付くでしょう。代わりに、クラスに文字列OrganizationIdプロパティを配置できます。Userその方が管理が簡単で、組織内のユーザーのリストが必要な場合は、インデックスを使用してその情報を照会できます。

ドキュメント構造の設計ドキュメントの関係の処理に関するレイヴンのドキュメントで詳細を読む必要があります。

于 2012-12-13T15:18:03.537 に答える