2011-07-02 4 views
0

다음 디자인 패턴을 사용할 수 있는지 알아 내려고 애 쓰고 있습니다.접합 테이블 및 정규화 질문

1) 응용 프로그램 (예 : AppA, AppB, AppC)를 대표 할 수 있어야합니다, 속성의 그것의 자신의 세트와 각각 : 나는 다음과 같은 요구 사항 (및 일부 다른 이상) 관계형 모델이있다.

2) 모든 응용 프로그램은 Internet (전자 메일, Twitter, Facebook), Phone (SMS, MMS 등)과 같은 다른 채널을 통해 통신 할 수 있으므로 프로그램과 채널간에 다 대다 관계가 있습니다.

3) 많은 프로그램에서 공유 할 수있는 일련의 미리 정의 된 식별자 (주소, 전화 번호, 로그인 계정)가 있으므로 프로그램과 식별자 사이에 다 대다 관계가 있습니다 .

4) 동일한 식별자가 여러 유형의 메시지를 보낼 수 있으므로 프로그램 (다시, 다 대다)도 가능하지만 응용 프로그램마다 통신 유형에 대한 식별자 사용을 제한 할 수 있어야합니다 기초.

기본적으로, 내가 한 일은 이들 각각에 대한 정보를 저장하는 네 개의 테이블, Program, Channel, IdentCommunicationType을 만들 수 있었고, 대신 (Program, Channel)에 대한 (Program, Identifier)을 접합 테이블을 만드는, 그래서있는 단지 설계를 복잡하게 할 , 난 (Program, Channel, Ident, CommunicationType)에 대한 고유 한 제약 조건과 함께 이러한 네 테이블의 기본 키로 구성된 단일 테이블을 만들었습니다. 이제이 테이블의 각 레코드는 주어진 통신에 링크됩니다.

물론 이것은 내 문제를 아주 쉬운 방법으로 해결하지만 지금은 이것이 정상화의 원칙을 저버린다면 이것이 받아 들여질 수 있는지 여부를 묻고 있습니다. 누구든지 내게 의견을 줄 수 있습니까?

답변

1

기본적으로, 내가 한 일은 프로그램, 채널, 행선지 및 CommunicationType는 이들 각각에 대한 정보, 좋은 생각

를 저장하기 위해, 네 개의 테이블을 만드는 것이 었습니다. 대신 (프로그램, 채널) 단지 설계를 복잡 것, 그래서있는, (프로그램, 식별자)에 대한 접합 테이블 을 만드는

, 나는 하나의 테이블의 기본 키 구성 를 생성 이 4 개의 테이블은 (프로그램, 채널, Ident, 통신 유형)에 대한 고유 제한 조건이 있습니다.

이와 같이 표를 디자인 할 때는주의해야합니다. {Program, Channel, Ident, CommunicationType} 키를 가진 구조는 프로그램과 채널, 채널과 식별자, 프로그램과 통신 유형 등 모든 가능한 조합을 허용합니다. 때때로 그것은 나쁜 생각입니다.

같은 식별자는 메시지의 여러 유형을 보낼 수 있습니다, 그래서 프로그램 (다시, 다 대다),하지만 난 통신에 입력을위한 식별자의 사용을 제한 할 수 있어야합니다 수 있습니다 신청 당 .

그게 나쁜 생각입니다. Ident, Program 및 CommunicationsType의 모든 조합이 유효한 것은 아닙니다.

유효한 테이블을 고유 한 테이블에 저장하십시오. 외부 키 참조를 사용하여 데이터 무결성을 유지하십시오.

{Program, Ident, CommunicationsType} 키가있는 테이블을 작성하십시오. {Program, Channel, Ident, CommunicationType} 키가있는 테이블은 외래 키 참조를 설정할 수 있습니다.

알고있는 모든 제약 조건을 구현하는 데 필요한만큼의 테이블을 빌드하십시오. 테이블이 많을수록 데이터 무결성 검사가 간단 해집니다. (언급 한 것보다 많은 테이블이 필요할 수도 있습니다. 두 개의 컬럼이 필요하다고 가정하지 마십시오. 더 많은 테이블이 필요하다고 가정하지 마십시오.)

{Program, Channel} 키가 필요합니다. 하지만 그렇게한다면,이 선을 따라 테이블을 만들어야합니다. (항공 코드)

create table pc (
    program_name varchar(10) not null references programs (program_name), 
    channel_name varchar(10) not null references channels (channel_name), 
    primary key (program_name, channel_name) 
); 

create table pict (
    program_name varchar(10) not null, 
    channel_name varchar(10) not null, 
    comm_type varchar(10) not null references communication_type (comm_type), 
    primary key (program_name, channel_name, comm_type), 
    foreign key (program_name, channel_name) 
     references pc (program_name, channel_name) 
); 

create table your-table-name (
    program_name varchar(10) not null, 
    channel_name varchar(10) not null, 
    comm_type varchar(10) not null, 
    ident varchar(10) not null, 
    primary key (program_name, channel_name, comm_type, ident), 
    foreign key (program_name, channel_name, comm_type) 
     references pict (program_name, channel_name, comm_type), 
    foreign key (ident) references ident (ident) 
); 

필요에 따라 다른 열을 추가하십시오. 경우에 따라 중복 외래 키가 필요할 수도 있습니다. 나는 네가 여기 필요하다고 생각하지 않지만 나는 잘못 될 수있다.

"정상화의 원칙에 어긋나는 경우"라는 의미가 확실하지 않습니다. 4 열 기본 키가있는 테이블은 다른 이유로 인해 그 이유만으로 일반 양식 을 위반하지 않습니다. 알려진 모든 제약 조건을 구현하지 못하는 것은 일반적으로 차선 설계이지만 일반적 형식을 위반하지 않기 때문입니다.

+0

+1. 당신의 대답에 대해 정말 고마워요! 나는이 디자인을 따를 것이라고 생각한다. 당신 말이 맞아, 나는'{Program, Ident, CommunicationType'의 모든 조합이 유효하지 않다는 것을 의미했습니다. 또한 {Channel, Program} 키가있는 표가 있어야하므로 디자인에 다시 한번 감사드립니다. – User

1

죄송합니다. 자세한 정보를 요청하는 답변을드립니다. 이 시점에서 내 평판은 아무런 코멘트가 없습니다 ...

설명을 바탕으로 선택한 디자인에 아무런 이상하지 않은 것을 볼 수 있습니다.

그러나 실제로 질문에 대답하기 위해이 디자인을 선택한 이유를 이해하는 것이 유용 할 것입니다.

결국 모든 키와 복합 고유 인덱스가있는 단일 테이블 없이도 작동합니다. 이런 식으로 모든 조합을 잠그는 것은 다소 제한적입니다.

통신을 찾으면 통신을 구성하는 정보에 액세스하기 위해 하나 이상의 다른 테이블과 조인해야합니다.

왜 고유 한 통신 경로를이 방식으로 저장 하시겠습니까?

+0

+1. 당신의 대답에 대해 정말 고마워요! 내 목표는 이중화 정보를 아무 곳에도 저장하지 않기 때문에 테이블 간의 조인에 많이 의존하고 있습니다. – User

1

나는 이것을하지 않을 것이다.

나는 테이블의 각 쌍 (또는 n-tuple) 사이에 하나의 접합 테이블을 작성합니다. 이렇게하면 결국 간단하게 쿼리 할 수 ​​있으며 필요에 따라 다른 방법과 독립적으로 각 경우에 적절한 방식으로 행을 제한 할 수 있습니다.

이러한 교차점에서는 소프트웨어마다 방향성, 페이로드, 사용 된 언어, 쿼리 포인트에 액세스하는 등의 추가 속성이 필요할 수 있습니다.

+0

+1. 당신 말이 맞아요, 지금이게 좋은 생각이 아니란 걸 압니다. 정말 고맙습니다. – User