3

想知道一些更有经验的人(或任何比我有更好想法的人)将如何处理我的特定建模场景......

我有一个典型的“Category -> SubCategory -> TertiarySubCategory”场景,我不确定我是否正确映射它。我将它直接映射到 MVC 路由,因为 raven 似乎很适合这个。在最终类别下(可以在第一、第二或第三级别,将有一个仅与该类别级别相关联的项目列表。所以,我们可能有类似的内容:

单级类别:'/政治/'

第二级类别:“政治/人”或“政治/网站”

三级类别:“体育/职业/排球”或“体育/大学/足球”

在传统的 RDBMS 中,这很容易通过主键/外键 + 一些连接......所以,想知道我将如何处理 Raven?

根据我的阅读,我应该将整个“体育/职业/排球”URI 或密钥存储在属于它的项目列表中吗?

IE -

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/");

{ ............. ETC ............... }

现在在这里我可以遍历 Items 集合和它的评论集合....这是否使用急切加载?如果我在一个类别项目下有一百万条评论怎么办?当我加载主要类别时,它也会加载所有一百万条评论!?!?

我将不胜感激您能提供的任何帮助。对不起,如果这个例子/问题不清楚......如果你们需要,我会尽力澄清任何事情。再次感谢!

4

1 回答 1

2

答案是这取决于您的数据大小和您的使用场景。如果您有大量项目并且想要访问没有项目的类别,则第一个示例很有用。如果您通常使用其项目访问类别,并且项目的大小有限(请注意,限制仍然很高,数千不会让我眨眼),第二个示例很有用。请注意,在 RavenDB 中没有像急切/延迟加载这样的东西,您说的是单个文档与多个文档,而不是文档之间的关系。需要时加载整个文档。

要记住的另一件事是,通过 id 查询通常比查询更快。这意味着,如果您的 id 看起来已经非常像 Document Id,那么您不妨将它们设为文档 id。

于 2011-06-02T21:14:43.267 回答