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

3

想知道一些经验丰富的人(或者比我更有想法的人)如何处理我的建模场景...

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

单层类别:'/政治/'

第二层类别:'政治/人物'或'政治/网站'

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

在传统的关系型数据库管理系统中,通过主键/外键+几个连接很容易实现... 所以,想知道我应该如何使用Raven处理?

根据我所了解的,我应该将整个“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/");

现在,我可以通过迭代项集合及其评论集合来完成操作。这是否使用了急切加载?如果在一个分类项目下有一百万条评论,那么当我加载主分类时,它会同时加载所有一百万条评论吗?

如果您能提供任何帮助,我将不胜感激。如果这个示例/问题不清楚的话,请原谅……如果您需要,我会尽力澄清的。再次感谢!

1个回答

2
答案是这取决于你的数据大小和使用场景。 如果你有大量项目并且想要访问没有其项目的类别,则第一个示例很有用。 如果您通常访问带有其项目的类别,并且项目的大小受限(请注意,有限仍然很高,几千个不会让我眨眼),则第二个示例很有用。 请注意,在RavenDB中没有急切/懒加载,您正在谈论单个文档与多个文档,而不是文档之间的关系。需要时加载整个文档。 还要记住的另一件事是,按ID查询通常比查询更快。这意味着,如果您已经拥有看起来非常像文档ID的ID,则可以将它们制作为文档ID。

好的,明白了。那么在第二个例子中,假设我有一个类别,其中每个条目都有 500 到 1000 条评论,总共是 25 万到 50 万...你觉得怎么样?使用第一种选择吗? - bbqchickenrobot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接