RavenDB(或其他面向文档的数据库)的建模问题

时间:2011-06-02 19:47:53

标签: nosql ravendb

想知道一些经验丰富的人(或者比我更有想法的人)将如何处理我的特定建模方案......

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

单级别类别:'/政治/'

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

三级分类:'体育/职业/排球'或'体育/学院/足球'

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

根据我的阅读,我应该将整个'sports / pro / volleyball'URI或Key存储在属于它的项目列表中吗?

即。 -

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

或者我应该创建实际类别类的List items成员?每个项目都有一个自己的评论列表......这意味着所有内容都存储在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集合及其评论集合....这是否会使用急切加载?如果我在一个类别项目下有一百万条评论怎么办?当我加载主类别时,它也会加载所有一百万条评论!?!?

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

1 个答案:

答案 0 :(得分:2)

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

要记住的另一件事是,通过id查询通常比查询更快。这意味着如果你的ID看起来非常像Document Ids,那么你也可以将它们作为文档ID。