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

Nosql RavenDB(或其他面向文档的数据库)的建模问题,nosql,ravendb,Nosql,Ravendb,想知道一些更有经验的人(或者比我有更好想法的人)会如何处理我的特定建模场景 我有一个典型的“Category->SubCategory->TertiarySubCategory”场景,我不确定我是否正确地映射了它。我将这直接映射到MVC路线,因为raven似乎很适合这一点。在最后一个类别(可以是第一、第二或第三级)下,将有一个仅与该类别级别相关的项目列表。因此,我们可能有如下内容: 单一级别类别:“/Politics/” 第二级分类:“政治/人民”或“政治/网站” 三级分类:“体育/职业/排球”

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

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

单一级别类别:“/Politics/”

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

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

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

从我读到的内容来看,我应该存储整个“sports/pro/volleyball”URI还是将其输入到一个项目列表中

i、 e.-

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/");
公共类类别项
{
公共字符串友好名称{get;set;}//排球或职业排球
公共字符串类别yuri{get;set;}//即-“/sports/pro/volleyball/”
公共字符串内容{get;set;}///即-“谁是最好的职业排球运动员?”
公共列表注释{get;set;}
}
//然后我们可以存储如下内容:
var survey1=新类别项目();
调查1.CategoryURI=“/sports/pro/volleyball/”
调查1.Content=“谁是最好的职业女排运动员?”;
调查1.评论。添加(新评论(“迷雾五月”);
var survey2=新类别项目();
survey2.CategoryURI=“/sports/pro/volleyball/”;
调查2.Content=“谁是最好的职业男排运动员?”;
调查2.评论。添加(新评论(“某个我不认识的家伙”);
//阿苏梅斯·拉文塞斯已经开始了。。。
ravenSession.商店(调查1);
ravenSession.商店(调查2);
ravenSessoin.SaveChanges();
//{……等等……}
//然后我可以按CategoryURI查询,而不需要连接(非规范化)…即-
var items=session.Query()
.式中(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();
公共类类别
{
公共字符串友好名称{get;set;}///即“排球”或“职业排球”
公共字符串URI{get;set;}//即-“/sports/pro/volleyball”,这是MVC路径
公共列表项{get;set;}
}
公共类类别项
{
公共字符串内容{get;set;}
公共列表注释{get;set;}
}
var vballCat=新类别();
vballCat.FriendlyName=“职业排球”;
vballCat.URI=“/sports/pro/volleyball/”;//相当于MVC路线
var catItem=new CategoryItem()。
catItem.Content=“谁是最好的男职业排球运动员?”;
catItem.Comments.Add(“Misty May”);
catItem.Comments.Add(“someguy1”);
vballCat.Items.Add(catItem);
ravenSession.Store(vballCat);
ravenSession.SaveChanges();
…现在,一旦我拉了第一只猫,即-“/sports/pro/volleyball/”我已经有了我需要的一切

var items = session.Query<Category>()
                 .Where(x => x.URI == "/sports/pro/volleyball/");
var items=session.Query()
。其中(x=>x.URI==“/sports/pro/排球/”;
{…………等等………}

现在,我可以在Items集合和它的评论集合中进行迭代…这是否使用了即时加载?如果我在一个类别项下有一百万条评论会怎么样?当我加载主类别时,它是否也会加载所有一百万条评论


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

答案是,这取决于您的数据大小和使用场景。 如果您有大量的项目,并且希望访问没有其项目的类别,则第一个示例非常有用。 第二个例子是有用的,如果你通常访问类别和它的项目,并且项目的大小是有限的(请注意,限制仍然很高,几千不会导致我眨眼)。 请注意,RavenDB中没有“急/缓加载”这类东西,您谈论的是单个文档与多个文档,而不是文档之间的关系。整个文档在需要时加载


另一件需要记住的事情是,通过id进行查询通常比查询更快。这意味着,如果您的id看起来已经非常像文档id,那么您最好将其设置为文档id。

好的,这是有意义的。因此在第二个示例中,假设我有一个类别,其中有500个项目,每个项目有500-1000条注释,总共有500条注释250k-500k…你怎么看?使用第一种选择?