문제

다음 데이터베이스에서 첫 번째 1:m 관계와 두 번째 1:m 관계 사이에 접합 테이블을 갖는 이점은 무엇입니까?

대체 텍스트 http://dl.getdropbox.com/u/175564/db/db-simple.png

그 책 Joe Celko의 SQL for Smarties 트리 및 계층 구조 그 이유는 1:m으로 독특한 관계를 맺기 위함이라고 합니다.예를 들어, 다음 표는 사용자가 정확히 동일한 질문을 두 번 묻고 정확히 동일한 대답을 각각 두 번 제공하도록 제한합니다.

최초의 1:m 관계

users-questions
===============
user_id REFERENCES users( user_id )
question_id REFERENCES questions ( question_id )
PK( user_id, question_id)           // User is not allowed to ask same question twice 

두 번째 1:m 관계

questions-answers
=================
question_id REFERENCES questions( question_id)
answer_id REFERENCES answers( aswer_id )
PK( question_id, answer_id )       //  Question is not allowed to have to same answers

고유성에 대한 이러한 이점은 내 코드를 더 어렵게 만들도록 설득하지 않습니다.PHP를 사용하여 이를 금지할 수 있기 때문에 DB에서 동일한 ID로 질문이나 답변을 가질 가능성을 제한해야 하는 이유를 이해할 수 없습니다.

도움이 되었습니까?

해결책

일반적으로 데이터의 복제로 인한 것입니다.

당신의 추론에 관해서는, 당신은 비즈니스 계층에서 이것을 시행 할 수 있지만, 실수를하면 상당한 양의 코드를 깨뜨릴 수 있습니다. 당신이 가진 문제는 데이터 모델에 몇 개의 테이블 만있을 수 있다는 것입니다. 운이 좋다. 데이터 모델이 커지면 구조를 이해할 수없고 GUI 레이어에 실수 화 된 테이블을 유지하기 위해 모든 논리를 넣어야한다면 문제가 발생할 수 있습니다. 잠금을 사용하지 않고 SQL 데이터베이스의 GUI에서 실내에 실을 만드는 것은 어렵습니다.

DBM은 이러한 문제를 다루는 데 매우 능숙합니다. 데이터 모델을 깨끗하게 유지하고 색인을 사용하여 필요한 속도를 제공 할 수 있습니다. 당신의 목표는 먼저 그것을 올바르게 얻는 것입니다. 그리고 당신이 그렇게해야 할 필요성을 볼 수있을 때 (성능 등) 테이블 만 제거하는 것입니다.

믿거 나 말거나, 정규화 된 데이터를 사용하면 응용 프로그램과 관련하여 인생이 더 어려워지는 상황이 많이 있습니다. 예를 들어, 질문과 답변이있는 큰 테이블 하나가 있으면 코드를 작성하여 고유한지 확인해야합니다. 기본 키가있는 테이블이 있다면 간단히 쓰십시오.

insert into table (col1, col2) values (@id, @value) --NOTE: You would probably 
--make the id column an autonumber so you dont have to worry about this

데이터베이스는 고유 한 가치가 없거나 의문의 여지없이 답을 놓고있는 경우 삽입하는 것을 방지합니다. 당신이해야 할 일은 삽입이 작동했는지 여부를 확인하기 만하면됩니다. 어느 것이 코드가 적다고 생각하십니까?

다른 팁

글쎄, 독특한 관계는 나에게 무의미 해 보입니다. 아마도 나는 당신이 기본 키 이외의 고유 키를 정의 할 수있는 DBMSE에 익숙하기 때문일 것입니다. 내 세상에서는 테이블과 같은 매핑 테이블이 여러분이 다수의 관계를 구현하는 방법이며, 일대일 관계를 위해 그것들을 사용하는 것은 광기입니다. 의도하다 관계가 일대일로 사용되기 위해서는 구현 다수의 지원입니다.

그래도 애플리케이션 레이어에서이를 시행 할 수 있기 때문에 지속성 계층에 고유 한 컴파운드 키에 유틸리티가 없다는 것에 대해 당신이 말하는 것에 동의하지 않습니다. 지속성 계층 고유성 제약 조건은 MySQL에서 이용할 수있는 능력과 같은 복제하기 어려운 혜택이 많이 있습니다. INSERT ... ON DUPLICATE KEY UPDATE.

이 상황에서 일대다에 대한 조인 테이블이 많은 이점을 추가하지 않는 것 같고 @chaos가 말했듯이 실제로 다대다 지원을 구현하게 된다는 데 동의합니다.하지만 Joe Celko는 똑똑한 사람입니다. 이것이 그가 말하는 정확한 대답일까요?

일대다 조인 테이블을 구현하는 또 다른 가능한 이유는 질문/답변을 사용자에 대한 의존성과 완전히 분리하기 때문입니다.

예를 들어 Dogs 테이블과 Deities 테이블.개는 이메일 주소가 없기 때문에 사용자로 등록할 수 없고, 신은 그 아래에 있기 때문에 사용자로 등록할 수 없다는 것을 우리 모두는 알고 있습니다.개와 신은 여전히 ​​질문을 할 수도 있지만, 그렇게 하려면 개-질문 테이블과 신-질문 테이블을 구현해야 할 수도 있습니다.이론상으로는 여전히 다대다 방식이지만 실제로는 여러 개의 일대다 방식을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top