3

経験豊富な人 (または私よりも優れたアイデアを持っている人) が、私の特定のモデリング シナリオにどのように取り組むのか疑問に思っています...

典型的な "Category -> SubCategory -> TertiarySubCategory" シナリオがあり、それを正しくマッピングしているかどうかわかりません。レイヴンはこれに適しているように見えるので、これを MVC ルートに直接マッピングしています。最後のカテゴリ (1 番目、2 番目、または 3 番目のレベルにある可能性があります) の下には、カテゴリのそのレベルのみに関連付けられたアイテムのリストがあります。したがって、次のようなものがあります。

単一レベルのカテゴリ: '/Politics/'

第 2 レベルのカテゴリ: 「政治/人々」または「政治/ウェブサイト」

3 段階のカテゴリ: 「スポーツ/プロ/バレーボール」または「スポーツ/大学/フットボール」

従来の RDBMS では、これは主キー/外部キー + いくつかの結合によって簡単に実現できます。

私が読んだことから、「sports/pro/volleyball」のURIまたはキー全体を、その下にあるアイテムのリストに保存する必要がありますか?

すなわち -

public class CategoryItem
{
     public string FriendlyName {get;set;} // Volleyball or Pro Volleyball
     public string CategoryURI {get;set;}  // i.e. - "/sports/pro/volleyball/"
     public string content {get;set;}  // i.e. - "Who is the best Pro Volleyball Athlete?"
     public List<string> Comments {get;set;}
}

// then we could store something like this:

var survey1 = new CategoryItem();
survey1.CategoryURI = "/sports/pro/volleyball/"
survey1.Content = "Who is the best female pro volleyball player?";
survey1.Comments.Add(new Comment("Misty May"));

var survey2 = new CategoryItem();
survey2.CategoryURI = "/sports/pro/volleyball/";
survey2.Content = "Who is the best male pro volleyball player?";
survey2.Comments.Add(new Comment("Some guy I don't kow");

// asuumes ravenSession was alreadyopened... 
ravenSession.Store(survey1);
ravenSession.Store(survey2);
ravenSessoin.SaveChanges();


//{ ...... etc .....  }
//Then I can query by CategoryURI without needing joins (denormalization)....  i.e. - 

var items = session.Query<CategoryItem>()
                 .Where(x => x.CategoryURI == "/sports/pro/volleyball/");

それとも、実際のカテゴリ クラスのリスト アイテム メンバーを作成する必要がありますか? 各アイテムには独自のコメントのリストがあります...つまり、すべてがRaven内の単一のドキュメントに保存されます-つまり-

public class Category
{
    public string FriendlyName {get;set;} // i.e. - "Volleyball" or "Pro Volleyball"
    public string URI {get;set;}  // i.e. -  "/sports/pro/volleyball"  which is the MVC path
    public List<CategoryItem> Items {get;set;}
}

public class CategoryItem
{
     public string Content {get;set;}
     public List<string> Comments {get;set;}
}

var vballCat = new Category();
vballCat.FriendlyName = "Pro Volleyball";
vballCat.URI = "/sports/pro/volleyball/";  // equivalent to the MVC route

var catItem = new CategoryItem().
catItem.Content = "Who is the best male pro volleyball player?";
catItem.Comments.Add("Misty May");
catItem.Comments.Add("Some Guy 1");
vballCat.Items.Add(catItem);

ravenSession.Store(vballCat);
ravenSession.SaveChanges();

.....ここで、最初の猫、つまり「/sports/pro/volleyball/」を引っ張ると、必要なものはすべてその下にあります

var items = session.Query<Category>()
                 .Where(x => x.URI == "/sports/pro/volleyball/");

{ …………など …… }

ここで、Items コレクションを反復処理できます。これはコメントのコレクションです。これは熱心な読み込みを使用しますか? 1 つのカテゴリ アイテムに 100 万件のコメントがあった場合はどうなりますか? メイン カテゴリを読み込むと、100 万件のコメントもすべて読み込まれます!?!?

ご協力いただければ幸いです。この例/質問が不明確な場合は申し訳ありません...必要に応じて何かを明確にしようとします。再度、感謝します!

4

1 に答える 1

2

答えは、データのサイズと使用シナリオに依存するということです。最初の例は、多数のアイテムがあり、アイテムなしでカテゴリにアクセスしたい場合に役立ちます。2 番目の例は、通常、そのアイテムを含むカテゴリにアクセスし、アイテムのサイズが制限されている場合に役立ちます (制限は依然として高いことに注意してください。数千でもまばたきすることはありません)。RavenDB には熱心な / 遅延読み込みのようなものはないことに注意してください。ドキュメント間の関係ではなく、単一のドキュメントと複数のドキュメントについて話しているのです。必要なときにドキュメント全体が読み込まれます。

覚えておくべきもう 1 つのことは、通常、クエリを実行するよりも ID でクエリを実行する方が高速であることです。つまり、すでにドキュメント ID によく似た ID がある場合は、それらをドキュメント ID にすることもできます。

于 2011-06-02T21:14:43.267 に答える