【问题标题】:Modeling Question for RavenDB (Or other doc oriented databases)RavenDB(或其他面向文档的数据库)的建模问题
【发布时间】:2011-06-03 05:14:43
【问题描述】:

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

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

单级类别:'/Politics/'

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

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

在传统的 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/");

或者我应该创建一个实际类别类的列表项成员吗?每个项目都会有一个它自己的 cmets 列表......这意味着所有内容都存储在 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/");

{ ......等...... }

现在我可以在这里迭代 Items 集合和它的 cmets 集合....这是否使用预加载?如果我在一个类别项目下有一百万个 cmets 怎么办?当我加载主类别时,它是否也会加载所有一百万个 cmets!?!?

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

【问题讨论】:

    标签: nosql ravendb


    【解决方案1】:

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

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

    【讨论】:

    • 好的,有道理。所以在第二个例子中,假设我有一个包含 500 个项目的类别,每个项目有 500 - 1000 cmets,总共有 250k - 500k ......你怎么看?使用第一个选项?
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2021-10-04
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多