일대 다와 다 대일 관계의 차이점


117

일대 다 관계와 다 대일 관계의 실제 차이점은 무엇입니까? 그것은 단지 반전 된 것입니까?

이 주제에 대한 '좋고 이해하기 쉬운'자습서를 찾을 수 없습니다. 초보자를위한 SQL : Part 3-데이터베이스 관계


1
이것은 완벽한 설명입니다 en.wikipedia.org/wiki/Many-to-many_(data_model)
RobertPitt

@RobertPitt 다 대다 기사가 질문과 어떤 관련이 있습니까? 당신은 아마 오히려 의미 ) en.wikipedia.org/wiki/One-to-many_(data_model을
TMG

답변:


111

예, 그 반대입니다. 엔티티가 존재하는 관계의 측면에 따라 다릅니다.

예를 들어 한 부서가 여러 직원을 고용 할 수있는 경우 부서 간 관계는 일대 다 관계 (1 부서는 많은 직원을 고용 함)이고 직원 대 부서 관계는 다 대일 관계입니다 (많은 직원이 한 부서에서 일함).

관계 유형에 대한 추가 정보 :

데이터베이스 관계-IBM DB2 문서


2
장면을 만들지 않는 것이 두렵습니다! ( 확실하지 않지만 ) 나는 순서가 의존성을 나타내는 것이라고 생각합니다! 그렇지 않습니까 ?? 예를 들어, 역할을 사용하는 사용자의 참조를 얻을 수 없기 때문에 사용자 대 역할은 일대 다일 수 있지만 다대 일은 아닙니다! 말이 돼?
Amanuel Nega 2014

아마 데이터베이스 관계 지금은?
fragorl

29

페이지에서 데이터베이스 용어에 대해

테이블 간의 대부분의 관계는 일대 다입니다.

예:

  • 한 지역은 많은 독자의 서식지가 될 수 있습니다.
  • 한 독자가 여러 구독을 가질 수 있습니다.
  • 한 신문에 여러 구독이있을 수 있습니다.

다 대일 관계는 일대 다와 동일하지만 관점이 다릅니다.

  • 많은 독자들이 한 지역에 살고 있습니다.
  • 많은 구독은 동일한 독자가 될 수 있습니다.
  • 많은 구독이 동일한 신문에 대한 것입니다.

20

일대 다 관계와 다 대일 관계의 실제 차이점은 무엇입니까?

데이터를 시각화하는 데 도움이되는 이러한 용어 사이에는 개념적 차이점이 있으며 완전히 이해해야하는 생성 된 스키마의 가능한 차이점도 있습니다. 대부분의 차이점은 관점 중 하나입니다.

(A)에 일대 다 관계가, 로컬 테이블에서 다른 테이블 많은 행과 연관 될 수있는 하나 개의 행을 갖는다. 초보자를위한 SQL 의 예에서 하나 Customer는 많은 Orders 와 연관 될 수 있습니다 .

반대의 다 대일 관계에서 로컬 테이블에는 다른 테이블의 한 행과 연관된 많은 행이있을 수 있습니다. 이 예에서 많은는 Order하나에 연결될 수 있습니다 Customer. 이 개념적 차이는 정신적 표현에 중요합니다.

또한 관계를 지원하는 스키마는 CustomerOrder테이블 에서 다르게 표현 될 수 있습니다 . 예를 들어 고객에게 다음 idname같은 열이있는 경우

id,name
1,Bill Smith
2,Jim Kenshaw

그런 다음 a Order가에 연결되기 위해 Customer많은 SQL 구현이 Order테이블에 id연결된 의을 저장하는 열을 추가합니다 Customer(이 스키마에서 customer_id:

id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2

위의 데이터 행에서 customer_idid 열을 보면 Bill Smith(customer-id # 1)에 2 개의 주문이 연결되어 있음을 알 수 있습니다. 하나는 $ 12.34이고 다른 하나는 $ 7.58입니다. Jim Kenshaw(customer-id # 2)는 $ 158.01에 대해 주문이 1 개뿐입니다.

알아 두어야 할 중요한 것은 일반적으로 일대 다 관계가 실제로 "일"인 테이블에 열을 추가하지 않는다는 것입니다. 에 Customer와의 관계를 설명하는 추가 열이 없습니다 Order. 실제로에는 및 테이블과 Customer일대 다 관계가 있지만 테이블에 추가 열이 추가되지 않을 수도 있습니다 .ShippingAddressSalesCallCustomer

그러나 다 대일 관계를 설명하기 위해 종종 id"일"테이블에 대한 외래 키인 "다"테이블에 customer_id열이 추가됩니다 Order. 이 경우에는 열이 . $ 12.34에 대한 주문 # 10을에 연결하기 위해 열을 의 ID 1에 Bill Smith할당합니다 .customer_idBill Smith

그러나 CustomerOrder관계 를 설명하는 다른 테이블이있을 수도 있으므로 테이블에 추가 필드를 추가 할 필요가 없습니다 Order. 대신 추가의 customer_id받는 사람 필드를 Order테이블이있을 수 있습니다 Customer_Order모두에 대한 키를 포함 테이블 CustomerOrder.

customer_id,order_id
1,10
1,11
2,12

이 경우 일대 다다대 일은 스키마 변경이 없기 때문에 모두 개념적입니다. 스키마 및 SQL 구현에 따라 달라지는 메커니즘입니다.

도움이 되었기를 바랍니다.


3
일반적인 경우를 포함 종속성이라고합니다. 외래 키 제약 조건은 가장 일반적인 포함 종속성 유형이지만 모든 포함 종속성에 외래 키가 포함되는 것은 아닙니다. 공통 속성 ( "참조")은 항상 테이블 에 모두 존재합니다 . "일"쪽에서는 이러한 속성을 후보 키라고합니다. "다"쪽에서 는 외래 키일 있습니다. 용어 "일대 다"또는 "다 대일"은 어느 쪽이 선택 사항 일 수 있는지 반드시 암시하지 않고 적어도 하나의 후보 키를 포함하는 모든 포함 종속성에 적용될 수 있습니다.
nvogel

흥미로운 @sqlvogel. 자바에서 javax.persistence.OneToMany다르게보다 ManyToOne. 그것들이 동의어이거나 구현에 달려 있다고 말하는 것입니까? 내 대답이 틀렸습니까?
Gray

2
문제는 Java가 아닌 관계형 데이터베이스와 SQL에 관한 것입니다. 아마도 당신은 자바에 대해 옳다.
nvogel

@sqlvogel을 예로 사용했습니다. "일대 다"와 "다 대일"이 동의어라는 말입니까?
Gray

2
나는 그것들이 정확히 같은 관계를 다른 관점에서 설명하는 두 가지 방법이라고 말하고 있습니다. 동일한 방식으로 "A는 B의 하위 집합입니다"는 "B는 A의 상위 집합입니다"와 같은 의미입니다.
nvogel

4

다른 점이 없다. 관계를 표현하는 방법은 언어와 선호도의 문제 일뿐입니다.


1
개념적으로는 물론 생성 된 스키마에도 확실히 차이가 있습니다. 내 대답보기 : stackoverflow.com/a/37954280/179850
Gray

4
@회색. 아니 없어. 귀하의 답변은 정확하지 않을뿐만 아니라 초보자 (이 질문을하는 사람들)를 혼란스럽게합니다.
PerformanceDBA

4

첫 번째 질문에 대한 답은 : 둘 다 비슷합니다.

두 번째 질문에 대한 답은 다음과 같습니다 : 일대 다-> MAN (MAN 테이블)에는 한 명 이상의 아내 (WOMEN 테이블) 다 대일-> 한 명 이상의 여성이 한 MAN과 결혼했습니다.

이제이 관계를 두 테이블 MAN 및 WOMEN과 연관시키려는 경우 하나의 MAN 테이블 행은 WOMEN 테이블의 행과 많은 관계를 가질 수 있습니다. 명확하기를 바랍니다.


3

하나의 관계가있는 두 개의 테이블

SQL

SQL에는 참조라고하는 한 종류의 관계 만 있습니다. (귀하의 프런트 엔드는 [일부 답변에서와 같이] 유용하거나 혼란스러운 일을 할 수 있지만 이는 다른 이야기입니다.)

  • 외래 키 하나 개의 테이블에서합니다 ( referenc 보내고 표)
    참고 기본 키 다른 테이블의합니다 ( referenc의 에드 테이블)
  • SQL 용어에서 Bar는 Foo를 참조
    합니다.

    CREATE TABLE Foo (
        Foo   CHAR(10)  NOT NULL, -- primary key
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK             -- constraint name
            PRIMARY KEY (Foo)     -- pk
        )  
    CREATE TABLE Bar (
        Bar   CHAR(10)  NOT NULL, -- primary key
        Foo   CHAR(10)  NOT NULL, -- foreign key to Foo
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK                -- constraint name
            PRIMARY KEY (Bar),       -- pk
        CONSTRAINT Foo_HasMany_Bars  -- constraint name
            FOREIGN KEY   (Foo)      -- fk in (this) referencing table
            REFERENCES Foo(Foo)      -- pk in referenced table
        )
  • 이후 Foo.Foo기본 키, 그것은 단지 하나의 행의 특정 값이 독특Foo

  • 때문에 Bar.Foo참조하는 외래 키이고, 어떤 고유 인덱스가 거기에 없다,의 주어진 값에 대해 많은 행이있을 수 있습니다Foo
  • 따라서 관계 Foo::Bar는 일대 다입니다.
  • 이제 당신 은 다 대일 관계를 인식 할 수 있습니다.Bar::Foo
    • 그러나 혼동하지 마십시오. BarFoo행에 대해 참조하는 행이 하나뿐입니다.
  • SQL에서는 이것이 우리가 가진 전부입니다. 이것이 필요한 전부입니다.

일대 다 및 다 대일 관계의 실제 차이점은 무엇입니까?

관계가 하나뿐이므로 차이가 없습니다. 지각 (한 "끝"또는 다른 "끝"에서) 또는 역방향 읽기는 관계를 변경하지 않습니다.

카디널리티

카디널리티는 데이터 모델에서 먼저 선언되며, 이는 논리적 및 물리적 (의도)을 의미 한 다음 구현에서 (의도 실현)를 의미합니다.

카디널리티

1 대 0 대 다
SQL에서 (위의 내용) 필요한 모든 것입니다.

일대 다 참조 테이블에서 트랜잭션 을 적용하려면 트랜잭션
필요 합니다.

일대 일대일 다음
이 필요합니다 Bar.

CONSTRAINT AK    -- constraint name
    UNIQUE (Foo) -- unique column, which makes it an Alternate Key

일대일 참조 테이블에서 트랜잭션 을 적용하려면 트랜잭션
필요 합니다.

다 대다
물리적 수준에는 그런 것이 없습니다 (SQL에는 관계 유형이 한 가지뿐입니다).

모델링 연습 중 초기 논리적 수준에서 이러한 관계를 그리는 것이 편리 합니다. 모델이 구현에 가까워지기 전에 존재할 수있는 것만 사용하는 것이 좋습니다. 이러한 관계는 연관 테이블을 구현하여 해결됩니다.

다 대다 해결


1
@Martijn 피터스. 행동 강령을 준수하도록 편집 할 수 있습니다. 그러나 (a) 설명 및 (b) 사실을 실제로 입증했습니다. 그것들에 대해 어떻게해야합니까?
PerformanceDBA

3
다른 사람의 지성이나 전문적인 행동에 대해 외침, 이름 부르기, 비난하지 않고 이러한 것들을 표현하는 다른 방법을 찾으십시오. 틀렸을 수도 있고 아닐 수도있는 사람들이 아니라 기술에 집중하세요.
Martijn Pieters

2

일대 다 및 다대 일은 다중도에서 유사하지만 Aspect (예 : 방향성)가 아닙니다.

엔터티 클래스 간의 연결 매핑 및 테이블 간의 관계 . 관계에는 두 가지 범주가 있습니다.

  1. 다중도 (ER 용어 : 카디널리티)
    • 일대일 관계 : 남편과 아내의 예
    • 일대 다 관계 : 어머니와 자녀의 예
    • 다 대다 관계 : 예제 학생 및 주제
  2. 방향성 : 매핑에는 영향을 미치지 않지만 데이터에 액세스하는 방법에는 차이가 있습니다.
    • 단방향 관계 : 다른 엔터티를 참조하는 관계 필드 또는 속성입니다.
    • 양방향 관계 : 각 항목에는 다른 항목을 참조하는 관계 필드 또는 속성이 있습니다.

관계형 데이터베이스에는 "방향성"이 없습니다. 각 관계에는 참조 (참조중인 테이블)와 참조 (참조를 수행하는 테이블)의 두 "끝"이 있습니다. SQL / DML을 사용하면 원하는 방식으로 모든 테이블을 참조 할 수 있습니다.… 한면… 다른면… 양면…면 없음.
PerformanceDBA

0

실질적인 차이는 없습니다. Devendra가 설명하는 것처럼 문제를 보는 방식에서 가장 의미있는 관계를 사용하십시오.


개념적으로는 물론 생성 된 스키마에도 확실히 차이가 있습니다. 내 대답보기 : stackoverflow.com/a/37954280/179850
Gray

3
@회색. 아니 없어. 귀하의 답변은 정확하지 않을뿐만 아니라 초보자 (이 질문을하는 사람들)를 혼란스럽게합니다.
PerformanceDBA

0
  • --- 일대 다 --- 부모는 둘 이상의 자녀를 가질 수 있습니다.
  • --- 다 대일 --- 그 세 자녀는 한 명의 부모를 가질 수 있습니다.

    둘 다 비슷합니다. 이것은 필요에 따라 사용할 수 있습니다. 특정 부모의 자녀를 찾고 싶다면 일대 다로 갈 수 있습니다. 또는 쌍둥이의 부모를 찾고 싶다면 다대 일로 갈 수 있습니다. 마찬가지로....,


-6

일대 다 에는 부모 클래스에 n 개의 자식이 포함되어 있으므로 컬렉션 매핑입니다.

다 대일 에는 n 개의 자식이 있습니다. 하나의 부모를 포함하므로 개체 매핑입니다.


이 답변은 좋으며 추가 정보가있는 이유를 이해하지 못합니다. 단방향 컨텍스트에서 일대 다 및 다대 일은 UX에 따라 동일한 코드 품질을 제공하지 않습니다. 관련 데이터 집합을 가져와야하는 경우 따라서 세트가 맵에 있기 때문에 어떤 조건이 괜찮은 select 문이 필요하지 않은 경우 일대 다가 더 현명하지만 사용자가 데이터 세트를 가져올 필요가없고 각 행에 고유 한 것으로 관심이있는 경우 하나 너무 많은 원하는 인스턴스는 현명한 선택
모하메드 Housseyn 탈 레브

좋은 대답 일 수는 있지만 같지는 않습니다. 다 대일에는 n 개의 자식을 포함하는 부모 클래스가 있고 일대 다에는 많은 부모 대 한 자식이 있습니다. SQL에서는 다 대일 관계가 전 방향 일 수 있으므로 차이를 만들지 않을 수 있지만 장고와 같은 프레임 워크에서는 일대 다 관계와 외래 키가 없기 때문에 이것은 중요한 문제입니다. 다 대일 관계를 다루는 것은 한 방향으로 만 자연스럽게 작동하며 같은 방식으로 다른 방향으로 사용할 수 없습니다.
iFunction
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.