5

Tôi đang lưu trữ dữ liệu về thống kê bóng chày và muốn làm như vậy với ba bảng: người chơi, battingStats và pitchingStats. Đối với mục đích của câu hỏi, mỗi người chơi sẽ có số liệu thống kê batting hoặc số liệu thống kê quảng cáo chiêu hàng, nhưng không phải cả hai.Làm cách nào để bình thường hóa các mối quan hệ một-một-hoặc-một-khác?

Làm cách nào để bình thường hóa mối quan hệ như vậy trong 3NF?

+0

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ê. –

+0

@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. –

Trả lời

6

playerid sẽ là một khóa ngoại trong cả BattingStats và bảng PitchingStats

[và nhớ đặt một số khía cạnh thời gian (mùa, năm, et al) trong các bảng thống kê]

và bằng cách này, đây là một giả định xấu: theo như tôi biết, bình đựng nước cũng được phép dơi!

2

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'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.

+0

Nó không phải là ngay lập tức rõ ràng với tôi như thế nào chèn các bảng Batters và Pitchers cải thiện mô hình dữ liệu hoặc làm cho nó bình thường hơn. Các bảng đó dường như chỉ lặp lại dữ liệu sẽ xuất hiện nếu player_id được sử dụng trực tiếp trong các bảng Batting_Stats và Pitching_Stats. –

+0

@Larry: Những bảng này xác định tập hợp các batters và tập hợp các bình từ "nhóm người chơi". Đó là * thông tin mới. Sau đó, số liệu thống kê batting chỉ có thể đề cập đến một người chơi từ "tập hợp batting" và tương tự cho quảng cáo chiêu hàng. –

+0

Nhưng thông tin chính xác đó sẽ có sẵn bằng cách kiểm tra cột player_id trong Batting_Stats và Pitching_Stats. Tôi thấy một trường hợp bổ sung được thiết kế của bạn xử lý, tuy nhiên - xác định vai trò của người chơi trong trường hợp không có bất kỳ số liệu thống kê nào cả. Nếu đó là bắt buộc thì các bảng phụ sẽ đáp ứng nhu cầu đó (như một cột role_type bổ sung trong Trình phát). –

1

Tôi biết cách thực hiện điều này từ góc nhìn thực tế (tôi muốn tạo một khung nhìn UNIONED trên bảng phân tách và đặt chỉ mục duy nhất trên ID trình phát - do đó, chúng chỉ có thể xuất hiện trong một bảng).

Hoặc trong bảng người chơi, ghi lại loại thống kê nào họ có và sau đó bao gồm điều đó trong mối quan hệ FK từ bảng thống kê.

Nhưng một trong hai loại này có lẽ gần với kim loại hơn bạn muốn.

Các vấn đề liên quan