2011-03-13 7 views
1

Oracle을 사용하고 있습니다. 때로는 하나 개의 쿼리 결과에 모든 애완 동물을 얻을 필요가여러 테이블에 대한 시퀀스 개체를 사용하여 조인시 쿼리 가능성 확인

고양이 (CAT_ID, cat_name, cat_age, cat_strength)

개 (dog_ID, dog_name, dog_age)

: 나는 두 개의 테이블이있다. Cat과 Dog 테이블 모두에서 사용할 수있는 animal_seq 시퀀스를 만들려고했는데 테이블에 중복 ID가 없도록 한 다음 가입시 쉽게 검색/쿼리 할 수있었습니다.

이것은 나쁜 습관입니까? 그렇다면 왜? 테이블을 디자인하는 더 좋은 방법이 있습니까 (예 : 단 하나의 동물 테이블 또는 다중 상속). 개인적으로 조인의 성능 문제로 인해 상속을 피하려고합니다.

답변

4

단일 시퀀스를 갖는 것은 전적으로 허용 가능하고 안전합니다. 오라클은 시퀀스에 대한 다중 읽기가 항상 고유 한 값을 반환하도록 보장하므로 중복 키에 문제가 없어야합니다.

CAT과 DOG 간의 스키마가 정말 고유하고 추가 동물 엔티티도 고유하면 별도의 테이블을 유지합니다. 고양이, 개, 원숭이 등에 관한 동일한 정보를 유지하려면 단일 동물 표에 넣는 것이 좋습니다. 무엇을 추천해야하는지 알기 위해서는 응용 프로그램/데이터베이스에 대한 추가 정보를 제공해야합니다.

+0

고양이는 스크래치 극 테이블에 외래 키를 가지고 있습니다. (나는이 모든 것을 btw로 만들고 무고한 사람을 보호하기 위해 이름을 대체합니다). 개들은 개 사육장 테이블에 외래 키를 가지고 있습니다. 애완 동물의 소유자는 사육장을 구입하거나 기둥을 긁을 수 있습니다. 등등. – BobTurbo

+1

흠 ... 주어진이, 당신은 ANIMAL 테이블, PRODUCT 테이블 및 ANIMAL_PRODUCT_XREF 테이블을 가지고 고려해야 할 수도 있습니다. ANIMAL_PRODUCT_XREF는 ANIMAL_ID를 PRODUCT_ID에 조인하는 상호 참조 테이블입니다. 이렇게하면 여러 동물에게 여러 제품을 제공 할 수 있습니다. –

1

새 디자인이나 조류 또는 다른 동물을 기록하고 싶다면 각 유형별 테이블을 만들어야합니다.

나는 KISS 원칙을 사용하고 하나의 테이블을 가지고 있으며 ANIMAL_TYPE (animal_type_id, Animal_type_name)이라는 다른 테이블에 가입하면 ID가 중복되지 않고 원하는 경향이 있다는 것을 알 수 있습니다. 다른 동물 유형을 기록하기.

+0

개는 강도 속성 (예 :)이 없기 때문에 많은 null 값이있을 것입니다. 그러나, 나는 아직도 그 선택을 고려하고있다. – BobTurbo

+0

반드시 개는 힘이 있습니다 :). 당신은 디자인이 미래에 증명 될 많은 null 값을 가질 수 있습니다. 어떻게 조인을하고 있니? –

+0

@BobTurbo : 오라클은 1 바이트 만 사용하여 null을 저장하며 행의 후행 null에는 스토리지가 필요하지 않습니다. 따라서 테이블이 너무 커서 사용하기가 까다로운 것처럼 희소 한 테이블에 대한 논리적 인 우려가있을 수 있지만 물리적 문제는 많은 사람들이 생각하는 것처럼 나쁘지 않습니다. –

1

기본 테이블 인 animal을 찾고 있다고 생각합니다. 그런 다음 두 하위 클래스 catdog이 있습니다. 이러한 디자인은 해당 동물의 "소유자"또는 "동물 관찰"또는 응용 프로그램의 목적이 무엇이든간에 정보를 추가 할 때 도움이됩니다. 서브 클래스 테이블의 서브 클래스의 특정 속성을 유지하면서

table animal(
    animal_id 
    ,animal_type <-- Discriminator column with for example C for cat, D for dog 
    ,name 
    ,age 
    ,primary key(animal_id) 
) 

table cat(
    animal_id 
    ,cat_strength 
    ,primary key(animal_id) 
    ,foreign key(animal_id) references animal(animal_id) 
) 

table dog(
    animal_id 
    ,dog specific attributes here 
    ,primary key(animal_id) 
    ,foreign key(animal_id) references animal(animal_id) 
) 

당신이 볼 수 있듯이

, 나는, 기본 테이블 animal에 공통 속성을 이동했습니다.

+0

이 문제는 모든 단일 삽입에 두 개의 삽입이 필요하며 모든 단일 쿼리에는 수백만 개의 조인이 필요하다는 것입니다. 이것이 이것이 객체라면 어떻게 될지 모르지만, 데이터베이스에서 oop가 너무 잘 작동하는지 확신 할 수 없습니다. – BobTurbo

+0

성능 저하는 최소화되고 웹 스케일의 멋진 소스 프로젝트에만 주목할 수 있습니다. 데이터베이스가 전체 또는 대부분의 무결성 제약 조건을 적용하고 나중에 성능에 대해 걱정할 수있는 깨끗하고 표현력있는 모델로 이동하십시오. 테이블의 조인이나 nr은 특정 성능 문제에 눈에 띄는 영향을 미치지 않습니다. – Ronnis

관련 문제