문제

좋아, 나는 너희들과 똑바로 갈 것이다 : 나는 도메인이 내 디자인을 어떻게 구동했는지 정확히 잘 모르겠지만, 모델 객체를 구축하고 지속성 계층을 무시하는 것으로 시작했다. 이제 모델과 일치하도록 SQL Server에 테이블을 빌드하는 가장 좋은 방법을 결정하는 데 어려움이 있습니다.

플랫폼이 그다지 중요하다고 생각하지는 않지만 ASP.NET MVC에서 웹 애플리케이션을 구축하고 있습니다. 다음 객체 모델 계층이 있습니다.

재산 - has properties such as Address and Postcode

 which have one or more

사례 - inherits from PropertyObject
인용하다 - inherits from PropertyObject

 which have one or more 

메시지 - simple class that has properties Reference, Text and SentDate

사례와 인용문에는 비슷한 속성이 많이 있으므로 상속받은 속성 요약 추상 기본 클래스도 있습니다. 따라서 속성에는 케이스 및 인용 객체를 모두 포함 할 수있는 유형 목록의 항목 속성이 있습니다.

따라서 본질적으로, 나는 몇 가지 인용문과 케이스와 그 중 하나에 속할 수있는 많은 메시지가있는 속성을 가질 수 있습니다.

PropertyObject에는 참조 속성 (따라서 견적 및 케이스)이 있으므로 모든 메시지 객체는 참조 속성에 의해 견적 또는 케이스와 관련 될 수 있습니다.

엔티티 프레임 워크를 사용하여 모델을 데이터베이스 안팎으로 가져 오려고 생각합니다.

나의 초기 생각은 속성, 사례, 인용문 및 메시지라는 네 가지 테이블을 갖는 것이 었습니다.

그들은 모두 자신의 순차적 인 ID를 가지고 있었고, 사건과 인용문은 PropertyID 필드와 재산과 관련이 있습니다.

메시지 테이블을 케이스와 인용 테이블과 관련하여 생각할 수있는 유일한 방법은 relateid와 relationtype 필드를 모두 갖는 것이지만 SQL Server에게 어떻게 작동하는지 알리는 명백한 방법은 없으므로 아무것도 없을 것입니다. 참조 무결성.

아이디어, 제안, 도움이 있습니까?

고마워요, 앤서니

도움이 되었습니까?

해결책

나는 속성이 PropertyObject에서 상속되지 않는다고 가정합니다.

이러한 테이블, 속성, 사례, 견적 및 메시지가 콘크리트 클래스 또는 TPC 상속 전략 당 테이블로 이어 지므로 일반적으로 권장하지 않습니다.

내 권장 사항은 다음 중 하나를 사용하는 것입니다.

  • 계층 당 테이블 또는 tph- 케이스 및 견적은 동일한 테이블에 저장되어 공유되지 않은 속성에 대한 널리 잡을 수있는 열이 있습니다.
  • 유형 또는 TPT 당 테이블 - 공유 필드 및 케이스와 인용 테이블이있는 PropertyObject 테이블 추가 및 해당 유형의 추가 필드 만있는 견적 테이블을 추가하십시오.

이 두 가지 전략을 사용하면 참조 무결성을 유지할 수 있으며 대부분의 ORM이 지원합니다.

자세한 내용은 다음을 참조하십시오. 팁 12- 상속 전략을 선택하는 방법

이것이 알렉스에 도움이되기를 바랍니다

다른 팁

아 ... 추상화.

DDD의 요령은 추상화가 항상 당신의 친구가 아니라는 것을 인식하는 것입니다. 경우에 따라 너무 많은 추상화가 너무 복잡한 관계형 모델로 이어집니다.

항상 상속이 필요하지는 않습니다. 실제로 상속의 주요 목적은 코드를 재사용하는 것입니다. 구조를 재사용하는 것은 중요 할 수 있지만 적습니다.

당신은 두드러진 IS-a 관계가 있습니다. Case IS-A Property 그리고 Quote IS-A Property.

클래스 계층 구조와 "IS-A"관계를 구현하는 몇 가지 방법이 있습니다.

  1. 유형 차별기와 함께 제안 했듯이이 하위 클래스가 실제로 어떤 서브 클래스인지 보여줍니다. 이것은 종종 다양한 서브 클래스의 결합을 생산해야 할 때 작동합니다. Caseproperty와 quoteproperty의 연합 인 모든 속성이 필요한 경우, 이것이 해결 될 수 있습니다.

  2. 상속에 의존 할 필요는 없습니다. 각 관계 세트에 대해 분리 테이블을 가질 수 있습니다. CaseProperty 그리고 QuoteProperty. 당신은 가질 것입니다 CaseMessage 그리고 QuoteMessage 또한 구별을 따르기 위해.

  3. 공통 테이블에 공통 기능을 가질 수 있고 별도의 테이블에서 별도의 기능을 수행하고 단일 객체를 재구성하기 위해 조인을 수행 할 수 있습니다. 그래서 당신은 가질 수 있습니다 Property 모든 속성의 공통 기능이있는 테이블 및 플러스 CaseProperty 그리고 QuoteProperty 각 서브 클래스의 고유 한 기능 Property. 이것은 당신이 제안하는 것과 유사합니다 Case 그리고 Quote 외국 열쇠가 있습니다 Property.

  4. 다형성 클래스 계층 구조를 단일 테이블로 평평하게하고 유형 식별기 및 NULL을 사용할 수 있습니다. 마스터 Property 테이블에는 유형 판별자가 있습니다 Case 그리고 Quote. 의 속성 Case are nulled for rows that are supposed to be a Quote. 마찬가지로, 속성 Quote are nulled for rows that are supposed to be a Case.

귀하의 질문 [[방법] 메시지 테이블을 케이스와 다시 연관시키고 인용 테이블"은 다형성 서브 클래제 세트에서 비롯됩니다. 이 경우 최상의 솔루션은 이것 일 수 있습니다.

Message FK 참조가 있습니다 Property.

Property 분리 할 유형 판별자가 있습니다 Quote ~에서 Case. 그만큼 Quote 그리고 Case 클래스 정의 둘 다 맵 Property, 그러나 유형 판별 자와 (일반적으로) 다른 열 세트에 의존합니다.

요점은 책임입니다 Property, CaseProperty 그리고 QuoteProperty 해당 클래스 계층에 속하며 그렇지 않습니다 Message.

이곳은 DDD 서비스 개념이 들어오는 곳입니다. 각 콘크리트 클래스의 저장소는 관련 객체가 아니라 해당 엔티티 만 지속됩니다.

따라서 Property ()가 있으며 CaseProperty ()의 기반입니다. : Property (). 이 특수 요소는 CasePropertyService ()를 통해 액세스됩니다. 여기에는 CaseProperty () 특수 엔티티 (실제로 케이스 () 자체가 아니라 자산이 아니라 조합)를 생성하기 위해 관련 테이블에 합류 할 수있는 곳이 있습니다.

OT : 여러 클래스를 상속받을 수없는 곳의 .NET의 제한으로 인해 이것은 내 작업입니다. DDD는 도메인에 대한 전반적인 이해에 대한 지침입니다. 나는 종종 친구들에게 내 DDD 개요를 제공하고, 그것이 무엇을하고 있는지 알아 내려고 노력합니다. 깨끗해 보이고 알아 내면 깨끗합니다. 친구들이 그것을보고 "당신이 여기서 무엇을 계속하려고하는지 전혀 모른다"고 말하면. 그런 다음 드로잉 보드로 돌아갑니다.

그러나 DDD 객체 (LINQ, EntityFramework 등)를 지속적으로 보관하기 위해 ORM을 사용하는 것에 대한 캐치가 있습니다. 여기에서 내 대답을 살펴보십시오.

stackoverflow : 리포지토리 및 도메인 개체에 대한 저장 방법에 대한 질문

캐치는 모든 객체가 ORM의 데이터베이스에 신원이 있어야합니다. 따라서 DB 구조를 계획하는 데 도움이됩니다.

최근에 ORM을 사용하여 직접 액세스를 제어하고 깨끗한 DDD 레이어 만 사용했습니다. 저장소와 서비스가 DB 계층에 대한 액세스를 제어하고 속도를 사용하여 내 객체를 엔터티 캐시로 사용하도록합니다. 이것은 실제로 : 1) DB 성능, 디자인은 직접 ORM 표현과 함께 도메인 객체와 결합되지 않는 가장 효율적이며, 2) 값 객체 등에 대한 강제 식별이 없어도 도메인 모델이 훨씬 깨끗해집니다. 무료!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top