2010-02-14 30 views
1

很明显,我错误地说DDD与EAV/CR的用处相似,但我目前看到的唯一区别是每个实体都有大量连接而不是三个表和大量连接的物理表。DDD值对象:如何在没有大量SQL连接的情况下坚持实体对象?

这一定是由于我缺乏对DDD的理解。 在导入数据时,如何将这些对象物理存储到数据库中,而无需大量连接和复杂化?我知道你可以简单地创建提供给你的存储库的对象,但是很难培训像Microsoft Sql Server Integration Server这样的工具来使用你自定义的C#对象和框架。也许这应该是我的问题,你如何使用Microsoft SQL Server集成服务和报表服务使用DDD ASP.NET C#框架?大声笑。

在EAV/CR数据库中,我们可以根据人员类型设置具有不同类别的单个人员表格:供应商,客户,买方,代表,公司,看门人等。三个表,一些联结,属性在我们插入之前,总是与验证字符串一样,就像MVC中的ModelValidation一样,对象接受任何值但不会持续到有效。

在一个标准的关系模型中,我们用来为每种类型的实体创建一个表,混合冗余数据类型,如城市。

使用域驱动设计,我们使用对象来表示每种类型的实体,每种类型的ValueObject嵌套对象,以及更多的嵌套对象。在我的理解中,这导致每种实体的表格和每种信息集合(一个值对象)的表格。有了这些表格,我看到很多连接。我们还最终为每个新的联系人类型创建一个物理表。显然有更好的方法,所以我必须在如何将对象持久化到数据库时不正确。

我的供应商是这样的:

public class Vendor { 
    public int vendorID {get; set;} 
    public Address vAddress {get; set;} 
    public Representative vRep {get;set;} 
    public Buyer vBuyer {get; set;} 
} 

我的买家:

public class Buyer { 
    public int buyerID {get; set;} 
    public Address bAddress {get; set;} 
    public Email bEmail {get; set;} 
    public Phone bPhone {get; set;} 
    public Phone bFax (get; set;} 
} 

我们是否真的引用之类的东西Vendor.vBuyer.bPhone.pAreaCode?我认为我们会参考并存储Vendor.BuyerPhoneNumber,并将这些对象几乎像别名一样构建到这些部分:Vendor.Address1,Vendor.Address2,Vendor.BuyerPhoneNumber ...等。

回答

1

真正的答案是将您的SQL规范化策略与您的对象相匹配。如果您有很多重复的地址,并且需要将它们关联在一起,则将数据标准化为单独的表,从而创建对值对象的需要。

1

您可以将您的对象序列化为xml并将其保存到Sql Server中的xml列。毕竟,您试图表示一个分层数据结构,这就是xml的优点。

1

域驱动的设计支持者通常建议尽可能将数据模型尽量靠近对象模型,但这不是一个铁定的规则。

如果您在对象关系映射图层中创建映射以将数据转换(投影)到对象中,则仍然可以使用a EAV/CR database design

决定如何设计您的对象并提供对子值的访问实际上是一个单独的问题,您必须根据具体情况解决。 Vendor.BuyerPhoneNumberVendor.vBuyer.bPhone.pAreaCode?答案总是取决于,因为它植根于您的具体要求。

相关问题