Sql server 如何使我的SQL DB与我的域驱动设计相匹配
好的,我将直截了当地告诉你们:我不确定我的设计是如何由域驱动的,但我确实从构建模型对象开始,完全忽略了持久层。现在,我很难决定在SQLServer中构建表以匹配模型的最佳方法 我正在用ASP.NETMVC构建一个web应用程序,尽管我认为这个平台并不重要。我有以下对象模型层次结构: Property - has properties such as Address and Postcode which have one or more Case - inherits from PropertyObject Quote - inherits from PropertyObject which have one or more Message - simple class that has properties Reference, Text and SentDate 属性-具有地址和邮政编码等属性 哪个有一个或多个 大小写-从PropertyObject继承 Quote-从PropertyObject继承 哪个有一个或多个 Message-具有属性Reference、Text和SentDate的简单类 Case和Quote有很多相似的属性,所以我也有一个PropertyObject抽象基类,它们从中继承。所以属性有一个类型为List的Items属性,它可以包含Case和Quote对象 所以本质上,我可以有一个属性,它有几个引号和案例,还有一堆消息,可以属于其中任何一个 PropertyObject具有引用属性(因此Quote和Case也是如此),因此任何消息对象都可以通过其引用属性与Quote或Case关联 我正在考虑使用实体框架来进出数据库 我最初的想法是有四个表:属性、案例、引用和消息 它们都有自己的顺序ID,大小写和引号将通过PropertyID字段与Property关联 我能想到的将消息表与Case和Quote表关联起来的唯一方法是同时具有RelationID和RelationType字段,但是没有明显的方法告诉SQL server这种关系是如何工作的,因此我没有任何引用完整性 有什么想法、建议、帮助吗 谢谢, 安东尼啊。。。抽象 DDD的诀窍是认识到抽象并不总是你的朋友。在某些情况下,过多的抽象会导致过于复杂的关系模型 你并不总是需要继承。实际上,继承的主要目的是重用代码。重用结构可能很重要,但不那么重要 你有一对突出的is-a关系:Sql server 如何使我的SQL DB与我的域驱动设计相匹配,sql-server,model-view-controller,entity-framework,domain-driven-design,Sql Server,Model View Controller,Entity Framework,Domain Driven Design,好的,我将直截了当地告诉你们:我不确定我的设计是如何由域驱动的,但我确实从构建模型对象开始,完全忽略了持久层。现在,我很难决定在SQLServer中构建表以匹配模型的最佳方法 我正在用ASP.NETMVC构建一个web应用程序,尽管我认为这个平台并不重要。我有以下对象模型层次结构: Property - has properties such as Address and Postcode which have one or more Case - inherits from Proper
Case
is-aProperty
和Quote
is-aProperty
有几种方法可以实现类层次结构和“is-a”关系
QuoteProperty
。您还需要CaseMessage
和QuoteMessage
来跟踪区分Property
表,其中包含所有属性的公共特性,再加上CaseProperty
和QuoteProperty
,其中包含Property
的每个子类的唯一特性。这与您所建议的案例
和报价
具有属性
外键类似属性
表具有用于大小写
和引号
的类型鉴别器。对于假定为引号的行,大小写
的属性为空。类似地,Quote
的属性对于假定为大小写的行为空
消息
具有对属性的FK引用
属性
有一个类型鉴别器,用于将引号
与案例
分开。Quote
和Case
类定义都映射到属性
,但依赖于类型鉴别器和(通常)不同的列集
关键是
Property
、CaseProperty
和QuoteProperty
的责任属于该类层次结构,而不是Message
,我假设属性也不会从PropertyObject继承
考虑到这些表、属性、大小写、引号和消息会导致每个具体类都有一个表或TPC继承策略,我通常不建议这样做
我的建议是,您可以使用:
- 每个层次结构的表或TPH-Case和Quote存储在同一个表中,其中一列用作鉴别器,未共享的属性的列可为空
- 每种类型的表或TPT-添加一个包含共享字段的PropertyObject表,以及仅包含这些类型的额外字段的Case和Quote表
Alex这就是DDD服务概念的用武之地。每个具体类的存储库只保存该实体,而不保存相关对象 所以您有Property(),并且是CaseProperty()的基础:Property()。此特殊实体通过CasePropertyService()访问。在这里,您可以对相关表执行连接等操作,以生成CaseProperty()特殊实体(实际上不是这样)