기본적으로, 내가 한 일은 프로그램, 채널, 행선지 및 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 열 기본 키가있는 테이블은 다른 이유로 인해 그 이유만으로 일반 양식 을 위반하지 않습니다. 알려진 모든 제약 조건을 구현하지 못하는 것은 일반적으로 차선 설계이지만 일반적 형식을 위반하지 않기 때문입니다.
+1. 당신의 대답에 대해 정말 고마워요! 나는이 디자인을 따를 것이라고 생각한다. 당신 말이 맞아, 나는'{Program, Ident, CommunicationType'의 모든 조합이 유효하지 않다는 것을 의미했습니다. 또한 {Channel, Program} 키가있는 표가 있어야하므로 디자인에 다시 한번 감사드립니다. – User