Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使我的SQL DB与我的域驱动设计相匹配_Sql Server_Model View Controller_Entity Framework_Domain Driven Design - Fatal编程技术网

Sql server 如何使我的SQL DB与我的域驱动设计相匹配

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

好的,我将直截了当地告诉你们:我不确定我的设计是如何由域驱动的,但我确实从构建模型对象开始,完全忽略了持久层。现在,我很难决定在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关系:
Case
is-a
Property
Quote
is-a
Property

有几种方法可以实现类层次结构和“is-a”关系

  • 正如您所建议的那样,使用类型鉴别器来显示这到底是哪个子类。当您经常需要生成各种子类的并集时,这种方法是有效的。如果您需要所有属性——CaseProperty和QuoteProperty的并集,那么这就行了

  • 你不必依赖继承;对于每一组关系,都可以有不相交的表<代码>案例属性和
    QuoteProperty
    。您还需要
    CaseMessage
    QuoteMessage
    来跟踪区分

  • 可以在公共表中包含公共要素,在单独的表中包含单独的要素,并执行联接以重构单个对象。因此,您可能有一个
    Property
    表,其中包含所有属性的公共特性,再加上
    CaseProperty
    QuoteProperty
    ,其中包含
    Property
    的每个子类的唯一特性。这与您所建议的
    案例
    报价
    具有
    属性
    外键类似

  • 您可以将多态类层次结构展平到单个表中,并使用类型鉴别器和NULL。主
    属性
    表具有用于
    大小写
    引号
    的类型鉴别器。对于假定为
    引号的行,
    大小写
    的属性为空。类似地,
    Quote
    的属性对于假定为
    大小写的行为空

  • 您的问题“[如何]将消息表与Case和Quote表关联起来”源自一组多态的子类。在这种情况下,最好的解决方案可能是这样

    消息
    具有对
    属性的FK引用

    属性
    有一个类型鉴别器,用于将
    引号
    案例
    分开。
    Quote
    Case
    类定义都映射到
    属性
    ,但依赖于类型鉴别器和(通常)不同的列集


    关键是
    Property
    CaseProperty
    QuoteProperty
    的责任属于该类层次结构,而不是
    Message
    ,我假设属性也不会从PropertyObject继承

    考虑到这些表、属性、大小写、引号和消息会导致每个具体类都有一个表或TPC继承策略,我通常不建议这样做

    我的建议是,您可以使用:

    • 每个层次结构的表或TPH-Case和Quote存储在同一个表中,其中一列用作鉴别器,未共享的属性的列可为空
    • 每种类型的表或TPT-添加一个包含共享字段的PropertyObject表,以及仅包含这些类型的额外字段的Case和Quote表
    这两种策略都允许您保持引用完整性,并且大多数ORM都支持这两种策略

    有关更多信息,请参见此:

    希望这有帮助
    Alex

    这就是DDD服务概念的用武之地。每个具体类的存储库只保存该实体,而不保存相关对象

    所以您有Property(),并且是CaseProperty()的基础:Property()。此特殊实体通过CasePropertyService()访问。在这里,您可以对相关表执行连接等操作,以生成CaseProperty()特殊实体(实际上不是这样)