1

가 나는 the non-prime attribute Winner Date of Birth is transitively dependent on the candidate key {Tournament, Year} via the non-prime attribute Winner

내가 함수 적 종속성이 있다고 생각하는 것을 말하는 3NF https://en.wikipedia.org/wiki/Third_normal_form

에 대한 위키가

Tournament Winners 
Tournament    Year Winner   Winner Date of Birth 
Indiana Invitational 1998 Al Fredrickson 21 July 1975 
Cleveland Open   1999 Bob Albertson 28 September 1968 
Des Moines Masters  1999 Al Fredrickson 21 July 1975 
Indiana Invitational 1999 Chip Masterson 14 March 1977 

을 줄 위키의 예 읽기

for two row X1 , X2 if X1.col1 = X2.col1 and 
X1.col2 = X2.col2, then col1 -> col2 

I cann 우승자의 이름 Al Fredrickson이 주어진다면 인디애나 인비테이셔널 (Indigo Invitational) 1998이 될 수도 있습니다. (우승자의 생일 -> 우승자 (동일한 생일과 같은 이름을 가진 사람이있을 수 있습니다) 그리고 우승자는 우승자의 자격을 획득 할 수 있습니다. 또는 Des Moines Masters 1999)

그래서 어떻게 결론에 도달합니까?

+0

질문의 키가 아닌 종속성은 {생년월일} -> {우승자} – sqlvogel

+0

+1 to sqlvogel이 아닙니다. 맞습니다. 그러나 두 명의 승자가 모두 Al Fredrickson이 아니라는 것을 어떻게 알 수 있습니까? 이 경우 울 데는 생년월일이 다를 수 있습니다. 그 사람의 대리인으로 그 이름을 사용하는 것은 나쁜 생각이며, 그것은 위키를 약하게 만듭니다. –

+0

실제로 시행하고자하는 FD가 명확하게 제시되지 않는 한 정확하고 그러한 예는 항상 부정적입니다. 현실에서는 반드시 이름을 승자의 식별자로 사용하지는 않겠지 만, 예를 들어 임의의 숫자를 발명하는 것보다 더 쉽고 간결합니다. – sqlvogel

답변

1

비공식적으로 functional dependency은 왼쪽에있는 하나의 값이 왼쪽에 하나 이상의 행에 존재하는 경우에도 오른쪽에 여러 값을 생성 할 수 없음을 의미합니다.1

그래서, 위키 백과의 예에서, 그/그녀가 여러 행에 존재하는 경우 (그/그녀가 여러 대회에서 우승하기 때문에) 같은 승자도 출생의 다른 날짜를 가질 수 있기 때문에 단순히 함수 적 종속성 Winner -> Winner Date of Birth있다.

이후 (위에서 설명한대로)

  • {Tournament, Year} -> Winner (한 토너먼트가 여러 수상자를 할 수 없기 때문에)
  • Winner -> Winner Date of Birth
  • 하지Winner -> {Tournament, Year} (한 사람이 이길 수 있기 때문에 여러 대회)

... by definition 다음과 같은 전이 d 독립성.

내가 Birth-의 우승자 날짜를 이해할 수 없다> 수상작은 (같은 생일과 이름이 같은 사람이있을 수있다?)

당신은 방향을 튀 겼다. 기능적 종속성은 단일 값에서 "오지"않고, "향하여"있습니다. 따라서 Winner -> Winner Date of Birth, 그러나 Winner Date of Birth -> Winner이 아닙니다.

동의어,이 모델에는 다른 이름을 가진 사람이 두 명있을 수 없습니다. 더 나은 (보다 현실적인) 모델은 대리 키를 사용하여 사람을 식별하고 중복 된 이름을 허용합니다. "기능"의 수학적 개념을 준수


1. 함수를 "호출"하는 횟수와 상관없이 (즉, f.d. 왼쪽면을 포함하는 행 수) 항상 동일한 결과 (f.d. 오른쪽면)를 생성합니다. 여러 결과를 생성 할 수 있다면 함수가 아니며 "관계"가됩니다.

+0

감사합니다. 매우 명확합니다. –

1

내가 이해하는 것 :
모든 {토너먼트, 연도}에 대해 한 명의 승자 만 있습니다. 각 수상자에게는 단 한 번의 생년월일이 있습니다. 위키는 이것이 취약점으로 이어질 수 있다고 주장합니다 :
새로운 행을 입력했다고 가정합니다. { "어리석은 토너먼트", "2013", "Al Fredrickson", "21 July 2012"} - 잘못된 생년월일을 입력했습니다 !
다른 테이블 {WinnerID, WinnerBithday}을 보유하면이를 방지 할 수 있습니다.

1

생년월일이 다른 동일한 영예인에 대한 항목이 있으면 어떻게해야합니까? 가능한 한 그 (것)들을 어떻게 막는가? 기본 테이블의 각 행은 특정 연도의 특정 대회에서 우승하는 우리에게 필요하기 때문에

에서

는 복합 키 {대회, 올해} 보장 속성의 최소한의 세트입니다 행을 고유하게 식별 할 수 있습니다. 즉 {토너먼트, 연도}는 테이블의 후보 키입니다.

는 관계 R는 다음 테이블의 또 다른 고유 레코드를 생성합니다 출생의 다른 날짜와 같은 우승자 이름을 추가 할 것입니다 경우 그것은해서는 안된다. 고유 한 기록이 필요하지만 두 개의 다른 생년월일이있는 동일한 승자가 테이블에 존재할 수 있음을 보여줍니다. 우리가 (수상자) 출생의 날짜의 중복을 생각하더라도

는 우리가 할 수 다른 테이블에서 해당 테이블을 분할 위키와 같은 중복 보여 주었다 방지하기 위해 {우승자, 출생의 승자 날짜} 저장할 수 있습니다.

참조

다른 기록에 출생의 다른 날짜로 표시되는 같은 사람을 중지하는 것이 존재하지 않기 때문에

.

그래서 중복을 방지하기 위해 다른 테이블을 만들어야합니다.