2014-03-05 3 views
1

가정 해 보겠습니다 I가 각 고객은 별개의 목적에 정확히 두 개의 전화 번호가 다음 스키마 (단지 예) :관계형 스키마 디자인 : "2 ~ 하나의"관계 "뒤로 계단식 삭제"

create table customer (
    id integer primary key, 
    home_phone_id integer not null, 
    work_phone_id integer not null, 
    foreign key (home_phone_id) references phone (id), 
    foreign key (work_phone_id) references phone (id) 
); 

create table phone (
    id integer primary key, 
    number varchar(10) not null 
); 

을 집 전화 번호와 직장 전화 번호로 구분하기 위해 외래 키는 customer 테이블에 있습니다. 이 기술적으로 전화 번호가 아닌 다른 방법으로 "012"가 "부모"테이블과 customer 자식 합니다. 고객이 없으면 전화 번호를 묻지 않습니다.

고객 행이 삭제되면 휴대 전화의 두 행을 으로 자동 삭제합니다. 이것은 정상에서와 같이 "자식"에서 "부모"까지의 계단식이며, 부모에서 자식으로의 이 아닙니다. 내 인상은 SQL 데이터베이스 이이 동작을 지원하지 않는다는 것입니다. 이 작업을 수행하기 위해 트리거를 사용할 수는 있지만 실제로 지원되지 않는다고 생각하면 은 스키마를 잘못 설계하고 있음을 의미합니다. customer 부모를 만들고,

  1. 이 동일 home_phonework_phone 테이블을 작성하는 customer_id 각 :

    나는 두 가지 대체 아주 좋은 것 같습니다 어느 것도 디자인을 상상할 수있다.

  2. phone에 외래 키를 이동하여 customer 부모를 확인하고 전화 번호의 두 가지 유형을 구별하는 (부울 is_home 같은) phone에 여분의 열을 사용합니다.

어떻게 설계할까요?

+0

옵션 3 : customer_id, phone_id, 중간에 링크로 입력하는 세 번째 테이블 만들기 – Randy

답변

0

옵션 2가 최선의 방법입니다. customer_idphone 테이블로 이동하고 새로운 phone_type 필드를 추가하면 두 가지 장점이 있습니다.

  1. 이제는 찾고있는 사람이 CASCADE DELETE입니다.
  2. 앞으로도 더 많은 전화 유형을 추가 할 수있게됩니다. 아마도 모바일, 비서 또는 보조 전화 번호 유형을 추가하려고합니다. , , 세포 다음 phone_type 분야에서

실제 데이터는 다음과 같은 값의 표준화 된 목록이 될 수 있습니다.