2014-02-08 6 views
3

저는 DDD를 처음 사용합니다. 집계 루트의 키로 일반 AggregateId (GUID가 포함 된 String 포함)를 사용하는 많은 예제 프로젝트를 보았습니다.DDD 집계 ID 및 외래 키

OneToMany 관계에있는 자식에서 aggregateRoot를 참조하는 방법에 대해 궁금합니다.

Order AggregateRoot 및 OrderLine이 있다고 가정 해보십시오. OrderLine이 데이터베이스 레벨에서이를 참조 할 수 있도록 GUID 옆에 여분의 생성 된 (예 : 시퀀스) ID가있는 것이 현명합니까? 또는 GUID를 주문하려면 orderLine의 외래 키입니까? 성능에 영향이 있습니까?

예 :

BaseAggregateRoot :

@MappedSuperclass 
public abstract class BaseAggregateRoot { 
    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride 
     (name = "idValue", column = @Column(name = "aggregateId", nullable = false)) 
    }) 
    protected AggregateId aggregateId; 
    ... 

주문 :

@Entity 
public class Order extends BaseAggregateRoot{ 
    // is this ID necessary? 
    @Id 
    @GeneratedValue(generator = "OrderSequenceGenerator") 
    @SequenceGenerator(name = "OrderSequenceGenerator", sequenceName = "ORD_SEQ1", allocationSize = 1) 
    @Column(name = "ord_seq") 
    private Long id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "aggregateId") <-- should this point to ID or aggregateId? 
    private List<OrderLine> orderLines; 
+0

가 AggregateRoot 뜻과는 신원이 SQL 기본 키되지 않습니다입니다! 그것은 당신이 집계하는 방법에 달려 있으며, 집계는 다른 집계의 참조를 가질 수 있습니다. – Ehsan

답변

1

첫째, 내가 DDD는 도메인 모델링에 관한 모든이며, 도메인이 지속되는 방법을와는 아무 상관이 없다는 것을 명확히하고 싶습니다 . 데이터베이스에 유지 될 수도 있지만 텍스트 파일에있을 수도 있습니다. 도메인 모델링 관점에서 엔티티가 다른 엔티티와 어떤 (및 어떻게) 관련되는지는 중요하지만 일반적으로 엔티티가 관계형 데이터베이스에서 어떻게 관련되는지는 중요하지 않습니다. 지혜로운 영업 사원에게 물어보십시오. 주문 광고 항목이 그 부분을 어떻게 식별 할 수 있는지 그리고 그가 당신에게 무엇이 잘못되었는지를 답장합니다.

성능면에서 GUID를 키로 사용할 때 위험이 있습니다. 무작위로 생성 된 GUID는 클러스터 된 인덱스에 적합하지 않습니다. 순차 생성 알고리즘을 사용하고 데이터베이스에서 해당 GUID를 제공하는 것이 가장 좋습니다. 난 당신이 특히 this answer을 읽을 수 권합니다

What are the performance improvement of Sequential Guid over standard Guid?

: 다음은이 주제에 대한 토론에 대한 링크입니다. 나는 순차적 인 GUID를 갖는 것이 그 요점을 빠뜨린 Dan에 동의한다.

관련하여 말하자면, 동일한 레코드에 대해 두 개의 식별자를 갖는 것은 불필요하고 일반적으로 현명하지 않습니다. 나는 당신이 하나를 고르라고 조언 할 것이다. 그래서, 어떻게 든 당신의 프로젝트에 GUID가 붙어 있다면. 순차적으로 생성하여 키로 사용할 수 있는지 확인하십시오. 그런 다음 @Id Long id을 삭제할 수 있습니다. 그렇지 않은 경우 @EmbeddedId@Column 특수 효과로 바꿉니다. 이 도움이

희망,

행운

+0

DDD를 구현하는 Vernon은 이것을 대리 ID라고 부르며 RDBMS/ORM 요구 사항 및 제한 사항을 다루는 완벽하게 유효한 접근 방법을 설명합니다. –

+0

고마워,하지만 알아. 긴 ID와 마찬가지로 GUID는 도메인 모델 ID가 아닙니다. 그것은 대리 정체성이기도합니다. 그러므로 내 충고입니다. –