2017-11-13 17 views
0

사용 된 예제는 실제로 해결할 도메인을 나타내지 않습니다. 그것은 단지 예에 불과합니다.DB 디자인 : 테이블 상속 및 계층 구조

배경

나는 table inheritance을 정의하고있다. 테이블 API 패키지 & 뷰를 사용하여 필요한 로직을 처리합니다. & 프리젠 테이션.

또한 이질 속성이있는 다중 다중 계층 명명 된 계층 구조를 정의해야합니다.

테이블 상속 (Location> State, City) & 명명 된 계층 구조 (State < - City)를 결합하면 디자인상의 문제가 발생합니다.

문제가

나는 도시의 이름은 주 내에서 고유 시행 고유 키를 정의 할 수 있지만, 이름 필드의 추상화가 방지된다. 필요한 경우 PL/SQL에서 처리 할 수 ​​있지만 SQL 수준에서 (가능한 경우 추가 테이블없이) 적용하려고합니다.

제약

다른 테이블은 계층 구조 일반적으로 (위치)의 모든 수준을 참조 할 수 있어야합니다.

다른 테이블은 특정 계층 구조 수준을 참조 할 수 있어야합니다. 내가 인해 관계의 그래프의 복잡성에 single table inheritance 할 수 없습니다

생각.

쉽게 이름 형식 필드를 복제하여 일반 형식을 위반하지는 않았지만 생각했습니다.

CREATE TABLE location 
(id  NUMBER ( 38) PRIMARY KEY 
, name VARCHAR2(1000) NOT NULL 
, type_id NUMBER ( 38) NOT NULL 
--, other common/super attributes 
); 

CREATE TABLE state 
(id NUMBER(38) PRIMARY KEY 
       REFERENCES location (id) 
--, child attributes 
); 

CREATE TABLE city 
(id  NUMBER(38) PRIMARY KEY 
         REFERENCES location (id) 
, state_id NUMBER(38) NOT NULL 
         REFERENCES state (id) 
--, child attributes 
); 
+0

위스콘신에는 6 개의 스프링 필드가 있습니다. Texarkana는 텍사스와 Arkansas에 있습니다 –

+0

States/City는 나의 실제 문제 도메인이 아닙니다. 나는 이것을 예제로 사용하고 있기 때문에 중복되는 도시 이름의 현실은 중요하지 않습니다. –

답변

0

(관련 테이블을 유지하므로와) 고유 할 도시와 국가 이름을 요구하는 이유가 표시되지 않습니다 어떤 정규형을 위반하는 것입니다. 도시 이름은 상태 이름 "New York"city! = "New York"상태와 동일한 속성이 아닙니다.

+0

명확히하기 : 뉴욕 주에 다른 도시가 2 개있을 수 있으며, 뉴욕이라고 명명 된 주 및 도시가있을 수 있지만 뉴욕 주라는 동일한 도시에는 2 개의 도시가있을 수 없습니다. –

0

"parent_location"을 위치 테이블에 추가하는 것이 좋습니다.

CREATE TABLE location 
(id  NUMBER ( 38) PRIMARY KEY 
, name VARCHAR2(1000) NOT NULL 
, type_id NUMBER ( 38) NOT NULL 
, parent_location_id number(38) NOT NULL 
--, other common/super attributes 
); 

CREATE UNIQUE INDEX location_u2 
    ON location (parent_location_id, name); 

CREATE TABLE city 
(id  NUMBER(38) PRIMARY KEY 
         REFERENCES location (id) 
, --state_id gone away 
--, child attributes 
); 

또한 동일한 이름의 두 상태가있는 것을 방지합니다.

단점은 상위 노드에 더미 "0"location_id를 사용해야한다는 것입니다.

감사합니다.

+0

중복 된 상태를 방지하지만 중복 된 도시가 주 내에있는 것을 방지하지 못합니다. 솔루션은 계층 구조의 모든 수준에 적용 할 수 있어야합니다. –

+0

안녕 피터, 이의 당신이 두 가지 상태를 가지고 있다고 가정 해 봅시다 : ID 이름이 지금 당신이 도시를 입력 캘리포니아 0 오레곤 0 1. parent_location_id : 3 포틀랜드 1 당신은 다른 도시를 입력 할 수 없습니다 고유 한 제약 조건을 위반하므로 name = "Portland"및 parent_location_id = 1을 사용합니다. – Guish

+0

동의; 그게 바로 내가 필요로하는 이유는 "도시의 고유 한 시행 이름은 국가 내에서 고유합니다"이므로 state_id와 name이 모두 필요합니다. 내 질문은이 두 필드에 대한 고유 제한 조건을 정의 할 수 있도록 테이블을 재구성하는 전략을 중심으로 이루어집니다. –