2010-03-16 3 views
36

사람들은 일대일 관계를 나타 내기 위해 다 대일 매핑을 사용하는 것을 보았습니다. 나는 또한 Gavin King의 저서와 기사에서이 글을 읽었습니다. (그것을 인용) 등최대 절전 모드 - 1 대 1을 나타 내기 위해 many-to-one을 사용해야하는 이유는 무엇입니까?

<class name="Customer" table="CUSTOMERS"> 
    ... 
    <many-to-one name="shippingAddress" 
       class="Address" 
       column="SHIPPING_ADDRESS_ID" 
       cascade="save-update" 
       unique="true"/> 
    ... 
</class> 

이 책의 이유 : 고객이 정확히 하나 개의 배송 주소를 가질 수 있으며, 배송 주소는 하나의 고객에 속할 수있는 경우

는 예를 들어, 매핑은 다음과 같이 주어진다 :

"당신은 협회의 대상 측에 무엇을 걱정하지 않는다, 그래서 당신은 많은 부분없이 - 일 협회처럼 처리 할 수 ​​있습니다."

제 질문은 many-to-one이고 one-to-one이 아닌 이유는 무엇입니까? many-to-one에 덜 바람직한 옵션 인 one-to-one은 무엇입니까?

감사합니다.

답변

28

데이터베이스에 일대일 연결을 구현하는 데는 여러 가지 방법이 있습니다. 기본 키를 공유 할 수 있지만 고유 제한 조건과 외래 키 관계를 사용할 수도 있습니다 (하나의 테이블에는 참조하는 외래 키 열이 있습니다 연관된 테이블의 기본 키).

나중에 매핑하는 최대 절전 모드는 many-to-one 연결 (외부 키를 지정할 수 있음)을 사용하는 것입니다.

이유는 간단하다 : 당신은 협회의 대상 측에 무엇 을 걱정하지 않는다, 그래서 당신은 많은 부분없이 to-one 연관 는 A를 처리 할 수 ​​있습니다. 당신이 원하는 것은 "이 엔티티는 다른 엔티티의 인스턴스에 대한 참조 인 인 속성을 가지고 있으며, 외래 키 필드를 사용하여 그 관계를 나타내는 을 표현하는 것입니다. many-to-one를 사용하여 즉

는, (실제로는 어쩌면 더 자주 공유 기본 키 일대일 협회보다) 일대일 외국 키 연관을지도 할 수있는 방법입니다.

+1

"고유 제한과의 외래 키 관계"를 매핑하는 방법에 대한 요점을 명확히하기 위해 예제를 제공 할 수 있습니까?이러한 관계가 논리적으로 일대일로 이루어지기 때문에 왜 동면 상태에서 다 대일로 매핑합니까? – KyleM

+5

이것은 _when_하지만 _why _...가 아닌 것 같습니다. –

+0

그러나 단점은'inverse = "true"'를 사용할 수 없다는 것입니다. '다 대일'에서는 작동하지 않습니다. – pavanlimo

3

이 문제는 근본적으로 객체 - 관계 임피던스 불일치와 관련이 있다고 말할 수 있습니다. 데이터베이스에서 두 개의 오브젝트 표현을 연관 시키려면 테이블간에 일종의 관계가 있어야합니다. 그러나 데이터베이스는 1 : N 관계 만 알고 있습니다. 나머지는 모두 1 : N 관계에서 파생됩니다.

관계형 데이터베이스와 객체 언어를 사용하면 개발자가 표현하고자하는 개념 (이 경우 1 : 1 관계)이 가장 부 자연스러운 표현을 찾는 것은 개발자의 몫입니다.

0

필자가 알고 있듯이 최대 절전 모드에서는 두 개체의 기본 키가 1 대 1의 관계로 일치해야합니다. 1 대 1로 설정하면 이러한 요구 사항을 피할 수 있습니다.

그러나 많은 경우 1 개 또는 전혀없는 개체가 있어야한다는 정보가 손실됩니다.

3

가장 큰 차이점은 공유 키 일대일 매핑 두 개체가 서로 바인딩된다는 것입니다. 두 개체가 함께 존재합니다.

f.e. 당신은 같은 이름의 테이블에 바인딩되는 사람주소 클래스를 만드는 경우, 각 사람이 정확히 하나 개의 주소가됩니다 ...

Person 클래스, 속성 : 주소 테이블 사람, 열 : ID, 에게 테이블 주소, 열 이름 : ... 한 많은 관계 테이블 구조가 약간 변경되지만 동일한 효과를 달성 할 수와 ID, 도시

  • Person 클래스 -> 속성 : 주소
  • 테이블 사람 -> 열 : ID, 이름, addressid (FK)
  • 테이블 주소 -> 열 : ID, 도시

...하지만도 더. 주소

  • 테이블 사람 -> 열 : : -> 속성

    • 클래스 담당자 : 이제이 사람이 여러 개의 주소 수 ID, 이름, addressid (FK), shippingaddressid (FK)
    • 테이블 주소 - > 열 : ID, 도시

    두 개의 외래 키 (addressid 및 shippingaddressid) 단일 DB 항목을 가리 수 있습니다 ... 또는 하나의 주소는 2 ~ 3 명에 속할 수 있습니다. 그 사람의 측면에서 many-to-one은 주소 측에서 일대 다입니다.

    그리고 단 1 개의 항목이있는 일대 다 연관은 어떤 모양일까요? 예, 일대일 방식과 비슷합니다 ...

    참고 : 주소는 실제로 값 개체이어야하며 DB에서 공유하면 안됩니다 (바보 같은 예입니다.하지만 괜찮습니다).) 짧은 그래서

    :

    1. 의 OR 매핑 일대일가 많이 사용
    2. 하나는 하나에 한계가있어왔다에
    3. 하나를 처리하기 어렵 대신에 모입니다 유연하고 똑같은 것을 달성 할 수 있습니다.