5

야구 통계에 대한 데이터를 저장하고 있으며 플레이어, battingStats 및 pitchingStats의 세 테이블로 데이터를 저장하려고합니다. 이 질문의 목적을 위해, 각 선수는 타격 스탯이나 피칭 스탯을 갖지만 둘 다 가질 수는 없습니다.일대일 또는 다른 관계를 어떻게 정규화합니까?

3NF에서 이러한 관계를 어떻게 정상화 할 수 있습니까?

+0

이미 해결책이 있습니다. 귀하의 질문에 설명 된대로 아래의 Steven A. Lowe가 설명하는 키를 사용하여 세 개의 표를 사용하십시오. 추가 정규화 문제 _ 통계표가있을 수 있지만 플레이어와 통계 간의 관계를 올바르게 모델링했습니다. –

+0

@Steven, 나는 투수가 박쥐 (NL과 인터 리그 경기에서)에 공모한다는 것을 동의하지만 이는 환상적인 야구 초안 도구이며 투수들의 타율은 포함되지 않습니다. –

답변

6

PlayerId는 BattingStats 및 PitchingStats 테이블

모두에서 외래 키가 될 [와 (계절, 년, 등)이 통계 테이블에 약간의 시간 차원을 넣어 기억]

및 방법에 의해 것 이것은 나쁜 가정이다 : 내가 아는 한, 투수도 배트를 허용한다!

2

정말로 3 개 이상의 테이블을 사용하지 않아도됩니까? Normalization은 일반적으로 하나의 정규화되지 않은 모델을 많은 정규화 된 관계로 분해 함을 의미합니다.

당신이 3 개 이상의 테이블을 가질 수 있다면, 당신은 (3NF에서) 다음 고려할 수 있습니다 : []에서

Players:  ([player_id], name, date_of_birth, ...) 
Batters:  ([batter_id], player_id) 
Pitchers:  ([pitcher_id], player_id) 
Batting_Stats: ([batter_id, time_dimension], stat_1, stat_2, ...) 
Pitching_Stats: ([pitcher_id, time_dimension], stat_1, stat_2, ...) 

속성은 기본 키를 정의하지만 선호하는 경우 surrogate key 사용할 수있다. Battters and Pitches의 player_id 속성은 unique constraint이어야하고 Players 관계에 대해서도 foreign key이어야합니다. Batting_Stats 및 Pitching_Stats에는 각각 Batters 및 Pitching에 대한 외래 키가 있어야합니다.

그러나 위의 내용은 플레이어가 배터 또는 투수가 될 수 없음을 강조합니다.


UPDATE :

한 가지 방법은 내가 선수는 타자 또는 유일한 투수하도록 강제 할 알고있다이 모델을 통해입니다 :

Players:  ([player_id], name, date_of_birth, ...) 
Roles:   ([role_id, role_type], player_id) 
Batting_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...) 
Pitching_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...) 

role_type해야 투수 나 배터를 정의하십시오. Batting_Stats 및 Pitching_Stats에는 (role_id, role_type)을 사용하는 역할에 대한 복합 외래 키가 있어야합니다. 역할에있는 의 고유 한 제한 조건은 플레이어가 하나의 역할 만 가질 수 있음을 보장합니다. 마지막으로 check constraints을 추가하여 Batting_Stats.role_type = 'Batter'Pitching_Stats.role_type = 'Pitcher'이되도록합니다. 이 체크 제약은 Batting_Stats가 항상 배터를 묘사하고, 투수를 주목한다는 것을 보증합니다. Pitching_Stats도 마찬가지입니다.

+0

Batters와 Pitchers 테이블 삽입이 데이터 모델을 향상 시키거나 더 평범하게 만드는 것은 당연하지 않습니다. 이러한 테이블은 player_id가 Batting_Stats 및 Pitching_Stats 테이블에서 직접 사용 된 경우에만 존재할 데이터를 반복하는 것으로 나타납니다. –

+0

@Larry :이 테이블은 "선수 풀"에서 타자 세트와 투수 세트를 정의합니다. 그것은 * 새로운 정보입니다. 그런 다음 타격 스탯은 "타격 세트"에서 플레이어를 지칭 할 수 있으며 피칭에 대해서도 마찬가지입니다. –

+0

Batting_Stats 및 Pitching_Stats에서 player_id 열을 검사하면 정확히 동일한 정보를 얻을 수 있습니다. 그러나 디자인에 의해 처리되는 추가 사례가 하나 있음을 알 수 있습니다. 즉, 통계가 없을 때 플레이어의 역할을 정의 할 수 있습니다. 이것이 필요한 경우 여분의 테이블이 필요에 부합합니다 (Players의 extra role_type 열과 마찬가지로). –

1

실용적인 관점에서 이것을 구현하는 방법을 알고 있습니다. (분리 된 테이블을 통해 UNIONed 뷰를 만들고 플레이어 ID에 고유 인덱스를 넣어서 한 테이블에만 나타날 수 있습니다).

또는 플레이어 테이블에서 보유하고있는 통계 유형을 기록한 다음 통계표의 FK 관계에이를 포함시킵니다.

그러나 둘 중 하나가 원하는 것보다 금속에 더 가깝습니다.

관련 문제