2009-08-24 2 views
0

다른 테이블을 참조하는 고유 ID 만 필요로하는 몇 개의 데이터베이스 테이블이 있습니다.각 테이블에 대해 새로운 기본 키 필드를 정의해야합니까?

Customer  Holiday 
********  ******* 
ID (PK) ---> CustomerID (PK) 
Forename  From 
Surname  To 
.... 

휴일과 같은 테이블은 고객에 관한 정보를 보관하기 위해 실제로 존재합니다. 따라서 휴일 ID를 보관할 별도의 필드를 지정해야합니까? 즉

Holiday 
******* 
ID (PK) 
CustomerID (FK) 
... 

아니면이 경우에는 CustomerID를 테이블의 기본 키로 설정하면됩니까?

감사합니다, James.

답변

3

이것은 실제로 무엇을하고 있는지에 따라 다릅니다.

각 고객이 단 하나의 공휴일을 가질 수 있다면 그렇습니다. 그렇다면 고객 ID를 기본 키로 만들 수 있습니다.

각 고객이 여러 공휴일을 가질 수 있다면, 아니요, 새 ID 열을 추가하여 기본으로 만듭니다. 이렇게하면 각 고객이 휴일을 선택하고 고유 한 ID로 개별 레코드를 선택할 수 있습니다.

각 고객이 1 개의 공휴일 만 가질 수 있다면 일대일 관계가 일반적으로 불필요하므로 공휴일 정보를 테이블에 추가하기 만하면됩니다.

+0

이 특별한 예에서 고객은 여러 개의 휴일을 가질 수 있습니다. 그러나 고객이 해당 테이블에 1 레코드 만 가질 수있는 경우 첫 번째 예가 가장 적절합니까? – James

+1

James - 잠재적입니다. 고객 당 레코드가 하나뿐이면 고객 테이블에 추가하는 것이 좋습니다. 일대일 관계에 대해 설득력있는 이유가없는 한. –

+0

+1 좋은 지적! 나는 각 고객이 오직 하나의 레코드만을 가질 수있는 테이블을 가지고 있는데, 테이블로 분리 한 이유는이 특정 테이블에 관한 많은 정보가 고객 테이블에 속한다고 느끼지 않았기 때문입니다. . – James

0

고객님의 질문을 정확하게 이해 한 경우 이 없을 경우에만 고객 테이블을 휴일의 기본 키로 사용할 수 있습니다. 테이블에있는 해당 고객의 다른 휴일이 될 수 없습니다. 다시 말해, 한 고객에 대한 두 개의 휴일은 고객 ID를 기본 키로 사용하여 중단됩니다.

0

이 데이터베이스와 관련된 개체 지향 프로그램이있을 경우 각 엔터티 (각 행)마다 고유 키가 있어야합니다.

두 번째 디자인은 Holiday의 각 인스턴스를 간단한 객체 관계형 매핑을 사용하여 OO 응용 프로그램에서 고유하게 식별하고 처리 할 수 ​​있음을 보증합니다.

일반적으로 데이터베이스의 모든 엔티티에 고유하고 불변의 시스템 할당 ("대리") 키가 있는지 확인하는 것이 가장 좋습니다. 다른 "자연스러운"키에는 비즈니스 로직에 맞는 고유 한 인덱스, 제약 조건 등이있을 수 있습니다.

0

이전 답은 맞지만, 각 테이블마다 2 개의 별도 기본 키를 가질 수 있으며 "holiday"테이블에는 CustomerId에 대한 외래 키가 있습니다.

그런 다음 코드에서 고객에게 공휴일 할당을 관리하여 하나의 공휴일을 고객에게 할당 할 수 있지만 문제 동시성이 발생합니다. 2 명이 공휴일을 고객에게 추가하는 것입니다. 같은 시간에 고객이 2 개의 휴일을 가질 가능성이 가장 높습니다.

고객이 만 휴가를 만들 수 있습니다 경우에도 고객 테이블에서 휴가 필드를 배치 할 수 있지만,이 디자인은 지저분하고, 정말 아직도 질문 2, 그래서 다시 한 번 옵션을

조언을하지 최선의 방법은 선택의 폭을 넓히는 것입니다.

+0

나는 암묵적인 데이터베이스 제약 조건을 적용하기 위해 코드에 의존하는 것을 크게 좋아하지 않습니다. 코딩 결함, SQL 스크립트 및 다른 세력은 이러한 가정 된 제약 조건/관계를 쉽게 손상시킬 수 있습니다. – Mayo

+0

메신저도 팬이 아니지만 가능한 한 많은 변형을 제공할만한 간단한 질문입니다. – Neil

0

실제로 모든 테이블에는 해당 테이블의 레코드를 식별하는 고유 기본 키가 있어야합니다. 다른 테이블과의 모든 관계를 명시 적으로 선언해야합니다.

다른 사람들이 관계를 더 잘 이해할 수 있습니다. 특히 도구를 사용하여 스키마를 시각적 표현으로 리버스 엔지니어링하는 경우 특히 유용합니다.

또한 향후에 솔루션을 확장 할 수있는 유연성을 제공합니다. 고객 당 하나의 휴일 만있을 수 있지만 고객 ID를 기본 키로 설정하면 변경하기가 훨씬 어렵습니다.

휴일 테이블에서 고객의 고유성을 지정하려면 해당 외래 키에 대한 고유 인덱스를 만듭니다. 사실, 이것은 고객 ID를 쿼리 할 때 성능을 향상시킬 수 있습니다 (이 개선 사항을 알 수있는 충분한 레코드가없는 것 같지만).

관련 문제