2010-01-29 3 views
1
 
      Users 
    /   \ 
    /   \ 
    M-T-O   M-T-O 
/    \ 
/     \ 
Products----M-T-M----Tags 

엔티티와 함께 ​​스키마를 만드는 방법에 대한 문서가 있는지 궁금합니다. 어떤 엔터티가 어떤 관계에 책임 져야하는지 궁금해지다.개체/개체 : Many to Many 및 Many to One

예 :

상품에 태그를 추가하고 싶습니다. 내

제품 엔티티이 같은 방법이 있습니다

public virtual void AddTag(Tag tag) 
    { 
     this.Tags.Add(tag); // IList<Tag> Tags 
     tag.AddProduct(this); 
    } 

먼저이 태그 목록에 태그 객체를 추가합니다. 그런 다음 해당 태그 객체가 'this'제품을 자체 제품 목록에 추가합니다.

지금까지 그렇게 좋았습니다.

하지만 태그에 제품을 추가하려면 어떻게해야합니까? 내

태그 법인이 같은 방법이 있습니다

public virtual void AddProduct(Product product) 
    { 
     this.Products.Add(product); // IList<Product> Products 
     // product.AddTag(this); 
    } 

그래서 처음 내 태그 객체의 제품 목록에 제품 객체를 추가합니다. 그런 다음 'this'태그를 제품에 추가 할 수 있었지만 이것이 내가 붙어있는 곳입니다. 주석 처리 된 메서드는 AddTag를 호출하는 등의 AddProduct를 다시 호출하기 때문에 stackoverflow 오류가 발생합니다.

내 스키마가 실제로 올바른지 확실하지 않습니다. 사용자에서 태그까지 M-T-O는 사용자가 가지고있는 태그를보고 싶을 때 쉽게 사용할 수 있습니다.

아무도 나를 올바른 방향으로 안내 할 수 있는지 궁금합니다. 사전에

감사합니다,

Pickels

답변

1

태그를 제품에 추가하는 것이 더 중요합니다. 나는 제품이 태그에 추가되는 것을 허용하지 않을 것이다.

다 대다 관계를 사용하면 어떤 엔터티가 관계의 기본 엔터티인지 결정하고이를 통해 컬렉션에 대한 액세스를 제어해야합니다. 다른 엔터티의 Add 메서드를 내부로 표시하여 액세스를 제어 할 수 있습니다.

태그 엔티티 :

internal virtual void AddProduct(Product product) 
{ 
    this.Products.Add(product); 
} 
0

가, MTM 관계 남자를 사용하지 마십시오 대신, 당신 만이 열이있는 새 테이블 Products_Tags 만들어야합니다 제품 ID와 TagID를. 이 외래 키는 다음과 같습니다.

  Users 
    /   \ 
    /   \ 
    M-T-O   M-T-O 
/    \ 
/     \ 
Products    Tags 
    \     /
    \    /
    \    /
    \    /
     \Products_Tags/ 
+0

내가 엔티티에 대해 이야기하고 다른 데이터베이스 스키마에 대해 말하지 않기 때문에 나는 그들이 당신을 무책임하게 생각했다고 생각합니다. 내 데이터베이스에는 ProductsTags 테이블이 있습니다. – Pickels

+0

질문은 데이터베이스가 아니라 도메인 모델에서 다 대다 관계를 모델링하는 방법입니다. –

0

목록이 이미이 요소가 포함되어 있는지 확인하는 것이 좋습니다이 있습니다.

if (!this.Tags.Contains(tag)) 
{ 
this.Tags.Add(tag); 
product.AddTag(this); 
} 
+0

Contains를 사용할 때 성능에 관심을 가져야합니까? – Pickels

+0

전체 구현 목록을 통해 .Contains = one 루프의 기본 구현에 대한 하나의 호출. – ikhaldeev

+0

With를 사용하면 참조 동등성에 대해 염려해야합니다. "이 메서드는 기본 동등 비교자인 EqualityComparer EqualityComparer <(Of <(T>)>)를 사용하여 같음을 결정합니다. 목록의 값 형식 인 T에 대한 기본값입니다." –

0

Tag.AddProduct은 제품의 태그의 내부 목록에 추가해야하며, Product.AddTag는 태그의 제품의 내부 목록에 추가해야합니다. DB에 대한 지속성은 상호 매핑을 처리해야합니다. 각 제품을 저장할 때 매핑 테이블에는 매핑 테이블에 저장된 행이 있어야하며 각 태그를 동일하게 저장해야합니다.

도메인에서이 논리를 유지하는 것이 나에게 의미가 없으며 어떤 실질적인 이점도 볼 수 없습니다. 제품에는 많은 태그가 있고 태그에는 많은 제품이 있습니다. 이는 도메인이 구조화 된 방식이어야하며 지속성 계층은 다 대다 관계를 처리합니다.

이렇게하면 모든 제품에 대해 어떤 태그가 있는지 알 수 있으며 그 반대의 경우도 있습니다. 실제로 알고 있어야하는 모든 것입니다.

class Users 
{ 
    private Tags tags; 
    private Products products; 
} 

class Tags : IList<Tag> {} 
class Tag 
{ 
    private Products products; 
    public void AddProduct(Product product); 
} 

class Products : IList<Product> {} 
class Product 
{ 
    private Tags tags; 
    public void AddTag(Tag tag); 
} 
+0

나는 이것에 꽤 동의하지 않는다; 관계의 양면을 유지하면 메모리 내 객체가 일관성있게 유지됩니다. 이 논리에 따라 예상되는 개체를 포함하도록 컬렉션의 제품 및 태그 개체를 유지하고 검색해야합니다. –

+0

그렇다면 확실하게 시스템의 아키텍처에 의존해서 인 메모리 객체는 DB와 M2M 관계가 맞지 않을 수 있습니다. 따라서로드는 메모리 상태가 DB의 상태와 일치하는 것을 피하기 위해 신중할 수 있습니다. –