【问题标题】:RavenDB Domain ModelRavenDB 领域模型
【发布时间】:2012-07-06 18:41:21
【问题描述】:

我正在构建我的第一个小型 RavenDB 应用程序,我想知道在构建域模型时我是否正确地处理了事情。

我有一个国家列表,我想在我的模型中的多个位置使用这些国家/地区。通常在过去我会创建一个数据库表来存储国家和一个国家对象,看起来有点像这样:

public class Country{
    public int Id {get;set;}
    public string CountryName {get;set;}
}

当我使用 country 类时,我会在另一个对象中保存它的一个实例,例如:

public class Shop{
    public int Id {get;set;}
    public string Name {get;set;}
    public Country InCountry {get;set;}
}

或者

public class Customer{
    public int Id {get;set;}
    public string Surname {get;set;}
    public Country CountryOfResidence {get;set;}
}

等等等等。我认为我现在应该做的是将国家/地区的 Id 存储在 ShopCustomer 类中是否正确,所以它们现在看起来像这样:

public class Shop{
    public int Id {get;set;}
    public string Name {get;set;}
    public int CountryId {get;set;}
}

public class Customer{
    public int Id {get;set;}
    public string Surname {get;set;}
    public int CountryOfResidenceId {get;set;}
}

当我从数据库中提取这些内容时,我可以使用 Raven API 的包含功能来获取相关的国家/地区对象,尽管它位于一个单独的对象中,例如我不能这样做 myCustomer.Country.Name

显然这是一个非常人为的例子,但我真的只是想在继续这条路线之前检查一下我没有完全错误地吠叫。

【问题讨论】:

    标签: domain-driven-design ravendb


    【解决方案1】:

    我尚未正确使用文档数据库,但我对您的问题的看法是:

    • 您不应该为了满足持久性实现的需要而弯曲域模型,但是如果有机会让您的聚合设计完全不了解持久性,我会认为它会是在使用文档数据库时.
    • 如果国家对象只包含一个名称,那么它很可能是Value Object,甚至不需要ID。值对象是不可变的,因此如果商店的国家/地区发生变化,您只需替换整个对象。无需引用 ID,因为多个聚合/实体引用相同的值并不重要。
    • 关于子实体:它们仅在聚合范围内发挥作用,这意味着您不应该在多个聚合中存在相同的实体。所以我想再次存储整个对象而不是对 ID 的引用。
    • 引用其他聚合是不同的。这是您要通过 ID 引用的位置。这个article 解释了原因。

    【讨论】:

    • 虽然我完全同意你的第一点,但我因为在使用 RavenDB 时试图保持我的域模型持久无知而受到批评。我认为 RavenDB 专家会告诉您构建域模型以适应 RavenDB。见inaspiralarray.blogspot.com/2012/05/why-i-left-ravendb.htmlinaspiralarray.blogspot.com/2012/03/…
    • 嗯,在我看来,文档数据库实际上比 RDMS 更适合一个对持久性无知的模型。如果您遵循我上面的观点(我相信您应该如何设计聚合),您可以简单地保存每个聚合,而不必担心按 ID 获取子实体。我的主要观点是:**如果你已经正确设计了聚合,你应该只需要获取和保存聚合,而不是单独获取子实体。
    • 另外 - 在你提供的第一个链接中,我几乎不同意他所说的所有内容。阅读 Chris Marisic 在博客上的评论。我在这篇文章中分享了他的感受。
    • 谢谢大家,上面有一些非常有趣的阅读材料。我想我只是想习惯以稍微不同的方式思考。
    猜你喜欢
    • 2010-12-20
    • 2014-01-05
    • 2012-09-04
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多