0

我正在使用 C# 中的 mongodb。

我有一个实体定义,我想从这个实体中引用另一个实体。(注意嵌入不是一个选项)

我知道我可以在第一个字段中插入一个带有另一个实体 ID 的字段。那是这样的:

class Person
{
    public object Id { get; set; }
    public string Name { get; set; }
    public object Pet { get; set; }  // note here I have the pet Id and not the pet.
}


class Pet
{
    public object Id{get;set;}
    .....
}

现在,我在我的领域逻辑业务中插入一些罕见的机制。

然后我的问题是:是否有一些实践可以让我将此类问题隐藏到我的域层,我的意思是在我的域中我只想拥有类似的东西:

class Person
{
   public object Id { get; set; }
   public string Name {get; set; }
   public Pet Pet { get; set; }  // note here I have the pet.
}


class Pet
{
   public object Id{get;set;}
   .....
}

在我的领域中,我希望专注于编码而不是机制。

4

2 回答 2

3

我的建议是不要使用 mongodb 作为关系数据库,它是一个 nosql aka document based db。在 nosql 中建模数据的推荐方法是将每个文档视为一个聚合根 (http://lostechies.com/jimmybogard/2008/05/21/entities-value-objects-aggregates-and-roots/) 即制作一个实体和值对象的区别非常关键 值对象不应该有 id。在 http://www.codeproject.com/Articles/87757/MongoDB-and-C下面的mongodb教程中

注释是值对象。所以主要问题是宠物一个值对象并且需要一个ID。如果没有,则从 Pet 类中删除 ID 并将 pet 嵌入到 Person 类中。如果它需要一个 ID,则在 Pet 类中保留 ID 字段,将其保存为自己的文档并将 Pet ID 存储在 Person 类中。这是 nosql 数据建模的推荐模式。

评估您的数据模型是否适合 nosql 的一个巧妙技巧是问自己此文档是否在一次旅行或文档中提供了上下文中的人(拥有宠物的人)的完整信息,那么通常您使用它不正确。尽管对于不同的 nosql 数据库,以下文章很好地传达了这个概念

http://ayende.com/blog/4465/that-no-sql-thing-the-relational-modeling-anti-pattern-in-document-databases http://ayende.com/blog/4466/that-no -sql-thing-modeling-documents-in-a-document-database

希望这可以帮助。

于 2012-09-24T19:37:54.117 回答
1

Best practice in this regard would be to have a mapping layer between the objects that hold data and your business entities. Your business entities can have the Nested Pet object fully available while your data objects simply have an Id.

You need to be very careful in this instance that you don't end up with an N+1 select problem.

I'm curious as to why embedding a document is not an option, as that is generally the best way to address this.

于 2012-09-24T18:56:46.257 回答