[SQL] 왜 대다 관계?
SQL왜 대다 관계?
나는 처음으로 데이터베이스와 SQL에 대해 배우고 있습니다. 텍스트에서 내가 읽고 있어요 (오라클 11g : 조안 Casteel하여 SQL을)은 "다 대다 관계가 관계형 데이터베이스에 존재할 수 없습니다."라고 말한다 나는 우리가 그들을 피할 수 있음을 이해하고, 내가 그들을 제거하는 브리징 개체를 만드는 방법을 이해하지만 완전히 문 이해에 나는 노력하고 있어요 "존재하지 수 있습니다."
그것은 대다 관계 표현이 실제로 물리적으로 불가능하다?
아니면은 데이터 중복의 많은에 이르게하기 때문에 단지 매우 비효율적이다?
후자의 경우로 나에게 것, 그리고 다리를 놓는 기업은 중복 된 데이터를 최소화 할 수 있습니다. 하지만 어쩌면 내가 뭔가를 놓친거야? 나는 텍스트 또는 다른 곳 I의 한을 검색하거나, 다 대다 관계를 피하기 위해 이유를 설명 (더 나은 아직 예를 들어 나) 구체적인 이유를 발견하지 않았습니다. 하루 종일 검색 만 동일한 정보를 반복 발견했습니다 ". 그것을 할, 대신 브리징 엔티티를 사용하지 않는" 그러나 나는 이유를 묻고 싶다. :-)
감사!
해결법
-
==============================
1.저자와 책 사이의 같은 간단한 관계에 대해 생각해보십시오. 저자는 많은 책을 쓸 수 있습니다. 책은 많은 작가를 가질 수있다. 이제 다리 테이블없이 다 대다 관계를 해결하기 위해, 대안은 무엇을 할 것인가? 당신은 책 테이블, 각 작성자 하나에 여러 Author_ID 열을 추가해야 할 것입니다. 하지만 당신은 얼마나 많은을 추가하는 방법은 무엇입니까? 2? 삼? 10? 그러나 많은 당신은 아마도 Author_ID 값의 대부분은 NULL입니다 당신이 경우에 걸쳐 실행하는거야 좋은 기회가있어 스파 스 열을 많이하게 될 겁니다, 선택 어디 필요 "한 번만 더." 그럼 당신도 지속적으로 수용하려고 스키마를 수정하고 또는 당신에 맞게 힘 것들 ( "어떤 책은 3 명 이상의 작가를 가질 수 없습니다") 일부 인공 제한을 부과하고 있습니다.
저자와 책 사이의 같은 간단한 관계에 대해 생각해보십시오. 저자는 많은 책을 쓸 수 있습니다. 책은 많은 작가를 가질 수있다. 이제 다리 테이블없이 다 대다 관계를 해결하기 위해, 대안은 무엇을 할 것인가? 당신은 책 테이블, 각 작성자 하나에 여러 Author_ID 열을 추가해야 할 것입니다. 하지만 당신은 얼마나 많은을 추가하는 방법은 무엇입니까? 2? 삼? 10? 그러나 많은 당신은 아마도 Author_ID 값의 대부분은 NULL입니다 당신이 경우에 걸쳐 실행하는거야 좋은 기회가있어 스파 스 열을 많이하게 될 겁니다, 선택 어디 필요 "한 번만 더." 그럼 당신도 지속적으로 수용하려고 스키마를 수정하고 또는 당신에 맞게 힘 것들 ( "어떤 책은 3 명 이상의 작가를 가질 수 없습니다") 일부 인공 제한을 부과하고 있습니다.
-
==============================
2.두 테이블을 포함하는 진정한 대다 관계는 관계형 데이터베이스에 작성하는 것은 불가능합니다. 나는 그들이 존재하지 수 있다고 말할 때 그들이 뭘 의미 믿습니다. 많은에 많은 구현하기 위해 당신은 기본적으로 3 필드의 ID, 제 1 테이블과 제 2 테이블에 atached에 id에 부착 된 ID가 중간 테이블이 필요합니다.
두 테이블을 포함하는 진정한 대다 관계는 관계형 데이터베이스에 작성하는 것은 불가능합니다. 나는 그들이 존재하지 수 있다고 말할 때 그들이 뭘 의미 믿습니다. 많은에 많은 구현하기 위해 당신은 기본적으로 3 필드의 ID, 제 1 테이블과 제 2 테이블에 atached에 id에 부착 된 ID가 중간 테이블이 필요합니다.
, 다 대다 관계를 원하지 않는 이유는 그들이 매우 비효율적이고, 당신이 어떻게되는지 한쪽에 기록을 삭제하면 관계의 각 측면에 연결된 모든 레코드를 관리하는 예를 들어, 힘들 수 있다고 말했다 같다 관계형 테이블과 다른 쪽의 표에 기록? 모두 삭제하는 것은 내 생각에 적어도 미끄러운 경사입니다.
-
==============================
3.나는 저자가 단지 논란이되고있는 생각한다. 기술적으로, SQL 언어로, 명시 적으로 M-M 관계를 선언 할 수단이 없다. 그것은 표 1에 여러-M 관계 선언의 출사 결과이다. 그러나, M-M 관계의 결과를 달성하기위한 일반적인 방법이며, 그것은 절대적으로 관계형 데이터베이스 관리 시스템의 설계 데이터베이스에 자주 사용된다.
나는 저자가 단지 논란이되고있는 생각한다. 기술적으로, SQL 언어로, 명시 적으로 M-M 관계를 선언 할 수단이 없다. 그것은 표 1에 여러-M 관계 선언의 출사 결과이다. 그러나, M-M 관계의 결과를 달성하기위한 일반적인 방법이며, 그것은 절대적으로 관계형 데이터베이스 관리 시스템의 설계 데이터베이스에 자주 사용된다.
그들이이 말의 더 정확한 방법이 될 것이다 사용하기에 적합한 곳 그들은 사용되어야한다. 같은 다른 솔루션은 비효율적 및 기타 데이터 무결성 문제를 소개 할 조 Stafanelli에 의해 주어진 책과 저자 예를 배가 있습니다. 그러나 M-M 관계는 더 사용하기에 복잡하고 있습니다. 그들은 GUI 디자이너의 부분에 더 많은 작업을 추가합니다. 그들을를 사용하는 의미가 어디에 따라서, 그들은에만 사용해야합니다. 당신이 하나의 엔티티는 반드시 다음, 다른 엔티티의 하나 이상과 관련해서는 안됩니다 것을 매우 확신 경우 1-M으로 제한합니다. 당신은 선적의 상태를 추적했다 예를 들어, 각 선적은 주어진 시간에 오직 하나의 상태를 가질 수 있습니다. 그것은을 통해 설계를 복잡하게하지 선적 여러 상태를 가질 수 있도록 논리적 인 의미가있다.
-
==============================
4.일반적으로 (말장난 의도)는 다 대다을 확립 할 수있는 링크 테이블을 사용
일반적으로 (말장난 의도)는 다 대다을 확립 할 수있는 링크 테이블을 사용
조 스테파넬 리 설명처럼,하자 당신이 저자와 책을 꿨어
SELECT * from Author SELECT * from Books
당신은 테이블이라고 AuthorBooks 가입 만들 것
그때,
SELECT * from Author a JOIN AuthorBooks ab on a.AuthorId = ab.AuthorId JOIN Books b on ab.BookId = b.BookId
그게 도움이되기를 바랍니다.
-
==============================
5.물론 그들은 존재 (그리고 할)를 할 수 있습니다. 나에게 그 소리는 가두 연설 문을 좋아한다. 그들은 수많은 비즈니스 애플리케이션에 필요합니다.
물론 그들은 존재 (그리고 할)를 할 수 있습니다. 나에게 그 소리는 가두 연설 문을 좋아한다. 그들은 수많은 비즈니스 애플리케이션에 필요합니다.
제대로 완료, 그들은 비효율적이며, 중 중복 데이터가 없습니다.
페이스 북을 살펴보십시오. 친구의 친구와 친구 사이에 얼마나 많은 다 대다 관계가 존재 하는가? 즉 잘 정의 된 비즈니스 요구입니다.
"다 대다 관계가 관계형 데이터베이스에 존재 할 수 없다."고 성명 명백한 거짓입니다.
-
==============================
6.다 대다 관계는 사실에 매우 유용합니다, 또한 일반적이다. 예를 들어, 그룹 명을 넣을 수있는 연락처 관리 시스템을 고려한다. 한 사람이 여러 그룹에있을 수 있으며, 각 그룹은 많은 회원을 가질 수 있습니다.
다 대다 관계는 사실에 매우 유용합니다, 또한 일반적이다. 예를 들어, 그룹 명을 넣을 수있는 연락처 관리 시스템을 고려한다. 한 사람이 여러 그룹에있을 수 있으며, 각 그룹은 많은 회원을 가질 수 있습니다.
의이 책이 정말로 무엇을 말하고 아마도 있음 - 이러한 관계의 표현은 별도의 테이블이 필요? 난 그냥 준 예를 들어, 당신은 Person 테이블 (ID, 이름, 주소 등) 및 그룹 테이블 (ID, 그룹 이름 등)를 가지고 것입니다. 나도 어떤 그룹의 사람들에 대한 정보를 포함하지 않는다; 기록은 개인과 그룹 사이의 관계를 나타내는 - 당신은 세 번째 테이블을 가지고 할 각 레코드는 사람 ID와 그룹 ID를 포함하는 (그 PersonGroup 전화).
그룹의 구성원을 찾을 필요하십니까? 귀하의 쿼리 (ID = 1 그룹에 대해) 다음과 같습니다
SELECT Person.firstName, Person.lastName FROM Person JOIN PersonGroup JOIN Group ON (PersonGroup.GroupID = 1 AND PersonGroup.PersonID = Person.ID);
-
==============================
7.그것은 올바른 것입니다. 많은 관계로 많은 사람들이 많은 관계로 몇 한으로 분류된다. 그래서 본질적으로, 많은 관계가 없습니다 많은 사람들이 존재하지 않는다!
그것은 올바른 것입니다. 많은 관계로 많은 사람들이 많은 관계로 몇 한으로 분류된다. 그래서 본질적으로, 많은 관계가 없습니다 많은 사람들이 존재하지 않는다!
-
==============================
8.음, 물론 그것은 또한 복잡성을 증가 그러나 M-M 관계의 증가의 정도로, M-M 관계가 관계형 데이터베이스에 존재을 수행하고 그들은 또한 브리지 테이블을 통해 어떤 수준에서 처리 할 능력이있는 느린 R-W 사이클 및 대기 시간에 결과. 관계형 데이터베이스에서 복잡한 M-M 관계를 회피하는 것이 좋습니다. 그래프 데이터베이스는 객체와 소셜 네트워킹 사이트 등 사용자와 친구들, 사용자 및 이벤트 사이의 M-M 관계를 처리하기위한 그래프 데이터베이스를 사용하는 이유의 사이에 많은 관계로 많은 처리에서 가장 좋은 대안 및 좋은
음, 물론 그것은 또한 복잡성을 증가 그러나 M-M 관계의 증가의 정도로, M-M 관계가 관계형 데이터베이스에 존재을 수행하고 그들은 또한 브리지 테이블을 통해 어떤 수준에서 처리 할 능력이있는 느린 R-W 사이클 및 대기 시간에 결과. 관계형 데이터베이스에서 복잡한 M-M 관계를 회피하는 것이 좋습니다. 그래프 데이터베이스는 객체와 소셜 네트워킹 사이트 등 사용자와 친구들, 사용자 및 이벤트 사이의 M-M 관계를 처리하기위한 그래프 데이터베이스를 사용하는 이유의 사이에 많은 관계로 많은 처리에서 가장 좋은 대안 및 좋은
-
==============================
9.의 책과 판매 테이블 사이 (많은 관계로 많은) 가상의 관계를 발명 보자. 당신이 책을 구입한다고 가정하고 각 책에는 그 책에 대한 송장 번호를 생성 할 필요를 구입할 수 있습니다. 책에 대한 송장 번호가 동일한 고객에게 여러 판매 대표 (없는 현실을하지만 이제 가정하자) 할 수도 가정하자. 우리는 책과 판매 엔티티 사이의 많은 관계에 많은있다. 그런 경우가 있다면 이제, 우리는 어떻게 우리가 이론적으로 동일한 송장 번호가있는 모든 책부터 3 권의 책을 구입 한 주어진 단지 1 책에 대한 정보를 얻을 수 있나요? 그 소개합니다 같아요 많은 관계로 많은 사용의 가장 큰 문제. 이제 우리는 책과 판매 사이에 가교 개체를 추가하는 경우 등 판매 각 책은 1 송장 번호, 많은 책은 우리가 아직 제대로 각각의 책을 식별 할 수있는 구매 얼마나 상관없이이 있는지 확인하십시오.
의 책과 판매 테이블 사이 (많은 관계로 많은) 가상의 관계를 발명 보자. 당신이 책을 구입한다고 가정하고 각 책에는 그 책에 대한 송장 번호를 생성 할 필요를 구입할 수 있습니다. 책에 대한 송장 번호가 동일한 고객에게 여러 판매 대표 (없는 현실을하지만 이제 가정하자) 할 수도 가정하자. 우리는 책과 판매 엔티티 사이의 많은 관계에 많은있다. 그런 경우가 있다면 이제, 우리는 어떻게 우리가 이론적으로 동일한 송장 번호가있는 모든 책부터 3 권의 책을 구입 한 주어진 단지 1 책에 대한 정보를 얻을 수 있나요? 그 소개합니다 같아요 많은 관계로 많은 사용의 가장 큰 문제. 이제 우리는 책과 판매 사이에 가교 개체를 추가하는 경우 등 판매 각 책은 1 송장 번호, 많은 책은 우리가 아직 제대로 각각의 책을 식별 할 수있는 구매 얼마나 상관없이이 있는지 확인하십시오.
-
==============================
10.대다 관계 명백 중복성뿐만 아니라, 삽입, 업데이트 및 이상 브리지 표 2를 통해 일대 다 관계로 변환하여 제거되어야 삭제할있다.
대다 관계 명백 중복성뿐만 아니라, 삽입, 업데이트 및 이상 브리지 표 2를 통해 일대 다 관계로 변환하여 제거되어야 삭제할있다.
-
==============================
11.M : N 관계 데이터베이스 설계에 존재해서는 안된다. 그들은 매우 비효율적 및 기능 데이터베이스에 대해하지 않습니다. 다 대다 관계 (항공기, 공항, 교사, 학생)와 함께 두 개의 테이블 (개체) 서로 모두가 될 수 없습니다 아이들은 어떤 곳 교차 테이블없이 외래 키를 넣어하는 방법이 없을 것이다. aircraft-> 비행 <- 공항; 교사 <- 클래스 -> 학생.
M : N 관계 데이터베이스 설계에 존재해서는 안된다. 그들은 매우 비효율적 및 기능 데이터베이스에 대해하지 않습니다. 다 대다 관계 (항공기, 공항, 교사, 학생)와 함께 두 개의 테이블 (개체) 서로 모두가 될 수 없습니다 아이들은 어떤 곳 교차 테이블없이 외래 키를 넣어하는 방법이 없을 것이다. aircraft-> 비행 <- 공항; 교사 <- 클래스 -> 학생.
교차 테이블은 예를 들어, 등급 비행은 항공기와 공항을 모두 필요로하는 클래스와 학생 모두를 필요로 두 개의 다른 테이블에 의존 엔티티를위한 장소를 제공합니다. 많은 - 투 - 많은 관계 데이터를 은폐. 교차 테이블이 데이터를 공개하고보다 쉽게 이해하고 함께 작업 할 수 있습니다 일대 다 관계를 만들 수 있습니다. 항공기 또는 공항 - 그래서, 문제가 발생, 무엇 표는 비행에 있어야합니다. 어느 쪽도 아니, 그들은 교차 테이블, 비행 외래 키 없어야합니다.
from https://stackoverflow.com/questions/7339143/why-no-many-to-many-relationships by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 계획 : 인덱스 스캔 / 인덱스 힘쓰라의 차이 (0) | 2020.06.21 |
---|---|
[SQL] ROW_NUMBER를 사용하여 쿼리에서 @@ 행 개수를 얻기의 효율적인 방법 (0) | 2020.06.21 |
[SQL] id 필드에 다시 씨앗으로 길을 레일 (0) | 2020.06.21 |
[SQL] SQL에서 여러 행을 삭제하는 방법 어디 ID = (X와 Y) (0) | 2020.06.21 |
[SQL] 날짜 범위와 PostgreSQL을 쿼리 (0) | 2020.06.21 |