상호 배타적 인 일대일 관계를 여러 개 갖는 것이 좋지 않습니까?


38

말, 테이블은 car테이블에 일대일 관계를 가지고 electric_car, gas_car하고 hybrid_car. A는 경우 car입니다 electric_car, 더 이상에 표시 할 수 없습니다 gas_car또는 hybrid_car

그러한 디자인에 문제가 있습니까? 도로에서 발생할 수있는 몇 가지 문제?

답변:


59

여러 유형의 자동차는 데이터 모델링에서 계속해서 반복되는 일반적인 문제의 예입니다. ER 모델링에서는 "일반화 / 전문화", 객체 모델링에서는 "수퍼 클래스 / 서브 클래스"라고합니다.

객체 모델러는 객체 모델에 내장 된 상속 기능을 사용하여 문제를 매우 쉽게 해결합니다. 서브 클래스는 단순히 수퍼 클래스를 확장합니다.

관계형 모델러에 문제가 있습니다. 상속을 통해 얻을 수있는 이점을 모방하도록 테이블을 디자인하는 방법은 무엇입니까?

가장 간단한 기술을 단일 테이블 상속 이라고 합니다 . 모든 유형의 자동차에 대한 데이터는 자동차 용 단일 테이블로 그룹화됩니다. 단일 유형의 모든 자동차를 그룹화하는 car_type 열이 있습니다. 자동차는 하나 이상의 유형에 속할 수 없습니다. 열이 전기 자동차와 관련이없는 경우 전기 자동차 와 관련된 행에는 열이 NULL 로 남습니다 .

이 간단한 솔루션은 더 작고 간단한 경우에 적합합니다. 많은 NULL이 있으면 스토리지 오버 헤드에 약간의 비트가 추가되고 검색 오버 헤드에 약간의 비트가 추가됩니다. 부울 테스트가 널 입력 가능 컬럼에서 수행되는 경우 개발자는 SQL 3 값 논리 를 학습해야합니다 . 처음에는 당황 스러울 수 있지만 익숙해집니다.

클래스 테이블 상속 이라는 또 다른 기술이 있습니다 . 이 설계에는 gas_car, electric_car 및 hybrid_car에 대한 별도의 테이블이 있으며 이들 모두에 대해 결합 된 테이블 car가 있습니다. 특정 종류의 자동차에 대한 모든 데이터를 원할 경우 적절한 특수 테이블로 자동차 테이블을 조인합니다. 이 디자인에는 NULL이 적지 만 더 많은 참여를합니다. 이 기술은 더 크고 복잡한 경우에 더 효과적입니다.

공유 기본 키라는 세 번째 기술이 있습니다. 이 기술은 종종 클래스 테이블 상속과 함께 사용됩니다. 서브 클래스의 특수 테이블에는 기본 테이블로서 car 테이블에있는 해당 항목의 기본 키 사본이 있습니다. 이 ID 열은 기본 키와 외래 키 모두로 선언 될 수 있습니다.

여기에는 새 자동차를 추가 할 때 약간의 추가 프로그래밍이 필요하지만 조인이 간단하고 쉽고 빠릅니다.

수퍼 클래스와 서브 클래스는 실제 세계에서 항상 발생합니다. 두려워하지 마십시오. 그러나 초기 디자인의 성능을 테스트하십시오. 첫 번째 시도가 단순하고 건전한 경우 속도를 높이기 위해 조정할 수 있습니다.


3
우와 고마워! 그것은 내가 알아 내려고했던 것에 주목합니다. 클래스 테이블 상속은 내가 ​​필요한 것 같습니다. 나는 내 경우뿐만 아니라 질문을 완전히 다루는 것으로 생각되므로 미래 독자들을 위해 이것에 대한 대답을 변경했습니다.
Arthur Tarasov

6
여기에 훌륭한 답변입니다. 팁 : 이러한 설계 결정을 철저히 문서화하십시오. 어떤 경로를 사용하든 누군가 데이터베이스 구조를 검사 할 때는 분명 하지 않습니다 . Postgres 와 같은 일부 데이터베이스를 사용하면 열, 테이블 등의 메타 데이터와 함께 주석을 바인딩 할 수 있습니다 .
Basil Bourque

전기 자동차가 하이브리드 자동차가되지 않도록 제한하는 것에 대해서는 다루지 않습니다. 이를 위해 별도의 테이블이 필요합니다.
jmoreno

2
네 말이 맞아 cars_type 필드를 cars 테이블에 추가하는 경우 전체 정규화를 벗어나는 비용으로 자동차가 한 유형에만 속하도록 제한 할 수 있습니다. 좋은 DBMS를 사용하면 하나 이상의 특수 테이블에 자동차를 입력 할 수없는 점검 제한 조건을 정의 할 수 있습니다. 거기에 약간의 오버 헤드가 있습니다. 새 차를 추가하십시오.
Walter Mitty

@WalterMitty이지만 car_type필드가 없으면 데이터를 검색 할 때 세부 정보를 찾을 테이블을 어떻게 알 수 있습니까? 특정 car레코드 에 대한 데이터가있는 테이블을 보려면 세 테이블을 모두 읽어야 합니까?
Josh Part

12

모델링하려는 데이터의 현실을 반영하는 데 필요한만큼의 엔티티 하위 유형을 모델에 포함시키는 데 아무런 문제가 없습니다. 문제는 하위 유형이 나쁜 습관인지 여부가 아닙니다. 문제 있을이 그것입니다 좋은 모델 ?

예를 들어, 플러그인 하이브리드 인 Audi A4 eTron과 같은 작업을 어떻게합니까? "전기 자동차"입니까 아니면 "하이브리드 자동차"입니까?

당신이 스스로 물어봐야 할 다른 질문은 왜 당신이 전혀 타이핑을하지 않는 것입니까? 하위 유형에 몇 개의 구별 술어가 있습니까? 이 술어 중 하나가 하위 유형간에 공유되어 있습니까? 상황이 복잡해질 수 있습니다.

하위 타이핑은 데이터베이스 디자인에서 분류를 위해 사용되지 않습니다. 코드, 외래 키에서 코드 테이블로 또는 플래그로 분류 할 수 있습니다. 서브 타이핑은 다양한 유형의 관심 대상에 대해 고유 한 술어 세트를 모델링하는 데 사용됩니다. 분류를 위해 하위 유형을 사용하는 경우 나쁜 습관입니다.

하위 유형이 데이터베이스가 관심있는 대상에 대해 다른 술어 세트를 명확하고 명확하게 모델링하는 경우 필요한 하위 유형 수에 관계없이 완벽하게 권장됩니다.


고마워, 나는 나 자신을 위해 어떤 종류의 함정을 설정하는 것을 두려워했다. 내 문제는 각 하위 유형에 많은 열이 있다는 것입니다. 일부는 겹치 car므로 테이블에 넣지 만 하위 유형 테이블에는 포함되지 않습니다. 예를 들어, 자동차 유형의 기본 부품을 저장하는 것과 같습니다. 전기 자동차 엔진은 100 부품, 가스 자동차 엔진 75 부품 및 하이브리드 125 부품을 가질 수 있습니다. (50 개) 부분은 일반에 저장된 것 cars50, 25, 75이 될 것 동안 electric_car, gas_carhybrid_car테이블
아서 Tarasov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.