1

我正在构建我的第一个小型 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 存储在ShopandCustomer类中是否正确,所以它们现在看起来像这样:

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

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

4

1 回答 1

3

我还没有正确使用文档数据库(还),但我对您的问题的看法是:

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