Bạn có thực sự bắt buộc không được sử dụng nhiều hơn 3 bảng. Normalization thường ngụ ý phá vỡ một mô hình không chuẩn hóa thành nhiều quan hệ bình thường hóa.
Nếu bạn có thể có nhiều hơn 3 bảng, bạn có thể muốn xem xét như sau (trong 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, ...)
thuộc tính trong []
xác định khóa chính, nhưng một surrogate key có thể được sử dụng nếu ưa thích. Thuộc tính player_id
trong Batters và Pitches phải có một unique constraint và nó cũng phải là foreign key đối với mối quan hệ Người chơi. Batting_Stats và Pitching_Stats cũng phải có khóa ngoại cho Batters và Pitching tương ứng.
Tuy nhiên, lưu ý rằng ở trên không bắt buộc người chơi chỉ có thể là người đánh bóng hoặc chỉ là người ném bóng.
UPDATE:
Một phương pháp tôi biết để thi hành rằng một cầu thủ chỉ là một bột hoặc chỉ có một bình, là thông qua mô hình này:
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, ...)
Các role_type
nên xác định một bình hoặc một đập. Batting_Stats và Pitching_Stats phải có khóa ngoài tổng hợp cho Vai trò bằng cách sử dụng (role_id, role_type)
. Một ràng buộc duy nhất trên player_id
trong Vai trò sẽ đảm bảo rằng người chơi chỉ có thể có một và chỉ một vai trò. Cuối cùng, thêm check constraints để Batting_Stats.role_type = 'Batter'
và Pitching_Stats.role_type = 'Pitcher'
. Những ràng buộc kiểm tra ràng buộc rằng Batting_Stats luôn mô tả một cái batter, và lưu ý một cái bình. Điều tương tự cũng áp dụng cho Pitching_Stats.
Bạn đã có giải pháp của mình. Sử dụng ba bảng như được mô tả trong câu hỏi của bạn, với các phím được mô tả bởi Steven A. Lowe, bên dưới. Bạn có thể có thêm các vấn đề bình thường hóa _inside_ bảng thống kê của mình, nhưng bạn đã mô hình chính xác mối quan hệ giữa người chơi và số liệu thống kê. –
@Steven, tôi đồng ý rằng bình bat (trong NL và trong chơi xen kẽ), nhưng điều này là dành cho một công cụ dự thảo bóng chày tưởng tượng và số liệu thống kê của người ném bóng không được tính. –