5

Beyzbol istatistiklerine ilişkin verileri saklıyorum ve bunu üç tablo ile yapmak istiyorum: oyuncular, battingStats ve pitchingStats. Sorunun amacı için, her oyuncunun vuruş istatistikleri veya atış istatistikleri olması gerekir, ancak her ikisi de geçerli değildir.Bire-bir-ya da diğer ilişkileri nasıl normalleştirirsiniz?

3NF'de böyle bir ilişkiyi nasıl normalleştiririm?

+0

Çözümünüz zaten var. Sorunuzda açıklandığı gibi üç tabloyu, aşağıda Steven A. Lowe tarafından açıklanan tuşlarla kullanın. İstatistik tablolarınızda daha fazla normalleştirme sorunlarınız olabilir. Ancak, istatistikler ve istatistikler arasındaki ilişkiyi doğru bir şekilde modellediniz. –

+0

@Steven, Sürahi pervanelerini (NL ve interleague oyunlarında) kabul ediyorum, fakat bu bir fantezi beyzbol taslak aracı ve sürahi oyuncularının vuruş istatistikleri için geçerli değil. –

cevap

6

playerid, BattingStats ve PitchingStats tabloları

hem yabancı anahtar olabilir [ve (mevsim, yıl, vd) istatistik tablolarda biraz zaman boyutunu koymak hatırlamak]

ve bu arada ediyorum Bu kötü bir varsayımdır: Bildiğim kadar, sürahi de yarasaya izin verilir!

2

Gerçekten 3'ten fazla tablo kullanmamanız gerekiyor mu? Normalization normal olarak normalize edilmemiş bir modeli birçok normalize ilişkide parçalamayı ima eder.

fazla 3 tablolar olabilir ise, (3NF olarak), aşağıdaki düşünebilir: [] içinde

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, ...) 

özellikler Birincil anahtar tanımlamak, fakat tercih edilen ise, bir surrogate key kullanılabilmektedir. Batters and Pitches'teki player_id özniteliği unique constraint olmalıdır ve ayrıca Oyuncular ilişkisine bir foreign key olmalıdır. Batting_Stats ve Pitching_Stats ayrıca, Batters ve Pitching için yabancı bir tuşa sahip olmalıdır. Bununla birlikte, yukarıdakilerin bir oyuncunun sadece bir meyilli olabileceği veya sadece bir sürahi olabileceğini göz önünde bulundurmadığına dikkat ediniz.


GÜNCELLEME:

bir yöntemi ben, bir oyuncu sadece bir hamur veya yalnızca sürahi olduğunu uygulamak farkındayım bu model geçer:

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 gerektiği Bir sürahi veya bir meyilli tanımlayın. Batting_Stats ve Pitching_Stats, (role_id, role_type) kullanarak Roller'e bileşik bir yabancı anahtar içermelidir. Roller'de player_id üzerinde benzersiz bir kısıtlama, bir oyuncunun yalnızca bir ve yalnızca bir rolü olabileceğini garanti eder. Son olarak check constraints'u ekleyin, böylece Batting_Stats.role_type = 'Batter' ve Pitching_Stats.role_type = 'Pitcher'. Bu kontrol kısıtlaması, Batting_Stats'ın her zaman bir hamuru tanımladığını ve bir sürahi olduğunu garanti eder. Aynı Pitching_Stats için de geçerlidir.

+0

Tabakların ve Sürahi'lerin yerleştirilmesinin veri modelini nasıl geliştirdiğini veya daha normal olmasını nasıl sağladığım hemen belli değil. Bu tablolar sadece player_id doğrudan Batting_Stats ve Pitching_Stats tablolarında kullanıldığında mevcut olabilecek verileri tekrarlıyor gibi görünmektedir. –

+0

@Larry: Bu tablolar, "oyuncular havuzundan" bir dizi bateri ve sürahi setini tanımlar. Bu * yeni bir bilgi. Daha sonra vuruş istatistikleri sadece "batting set" den bir oyuncuya başvurabilir ve aynı zamanda pitching için de geçerlidir. –

+0

Ancak, Batting_Stats ve Pitching_Stats içindeki player_id sütununu inceleyerek, bu aynı bilgiler kullanılabilir. Bununla birlikte, tasarımınız tarafından ele alınan bir ek vaka daha görüyorum - bir oyuncunun rolünü hiç bir istatistik yokluğunda tanımlamak. Bu gerekli ise ekstra tablolar bu ihtiyacı karşılayacaktır (Oyuncularda ekstra bir role_type sütunu gibi). –

1

Bunu pratik bir perspektiften nasıl uygulayacağımı biliyorum (ayrık tablolarda bir UNIONed görünümü oluşturabilir ve oyuncu kimliğine benzersiz bir indeks ekleyebilirim - bu nedenle, yalnızca bir tabloda görünebilirler). Veya oyuncular tablosunda, ne tür istatistiklere sahip olduklarını kaydedin ve istatistik tablosundaki FK ilişkisine bunu dahil edin.

Fakat bunlardan herhangi biri muhtemelen metale istediğinizden daha yakındır.