想知道一些经验丰富的人(或者比我更有想法的人)将如何处理我的特定建模方案......
我有一个典型的“类别 - > 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集合及其评论集合....这是否会使用急切加载?如果我在一个类别项目下有一百万条评论怎么办?当我加载主类别时,它也会加载所有一百万条评论!?!?
感谢您提供的任何帮助。对不起,如果这个例子/问题不清楚......如果你们需要,我会尽量澄清任何事情。再次感谢!
答案 0 :(得分:2)
答案是,这取决于数据的大小和使用方案。 如果您有大量项目并且想要访问没有项目的类别,则第一个示例很有用。 如果您通常使用其项目访问类别,并且项目的大小有限(请注意,限制仍然很高,数千个不会导致我闪烁),第二个示例很有用。 请注意,在RavenDB中没有急切/延迟加载这样的东西,你说的是单个文档与多个文档,而不是文档之间的关系。整个文档在您需要时加载。
要记住的另一件事是,通过id查询通常比查询更快。这意味着如果你的ID看起来非常像Document Ids,那么你也可以将它们作为文档ID。