5

Ich speichere Daten über Baseball-Statistiken und möchte dies mit drei Tabellen tun: Spieler, BattingStats und PitchingStats. Für den Zweck der Frage wird jeder Spieler Batting-Stats oder Pitching-Stats haben, aber nicht beide.Wie normalisieren Sie die Eins-zu-Eins-oder-die-andere-Beziehungen?

Wie würde ich eine solche Beziehung in 3NF normalisieren?

+0

Sie haben bereits Ihre Lösung. Verwenden Sie drei Tabellen, wie in Ihrer Frage beschrieben, mit den von Steven A. Lowe beschriebenen Schlüsseln. Möglicherweise haben Sie weitere Probleme mit der Normalisierung innerhalb Ihrer Statistiktabellen, aber Sie haben die Beziehung zwischen Spielern und Statistiken korrekt modelliert. –

+0

@Steven, ich stimme zu, dass Pitcher Fledermaus (in den NL und in Interleague spielen), aber das ist für ein Fantasy-Baseball-Draft-Tool und Pitchers Stats zählen nicht. –

Antwort

6

playerid würde ein Fremdschlüssel in beiden BattingStats und PitchingStats Tabellen

[und erinnern einige Zeit Dimension (Jahreszeit, Jahr, et al) setzen in den Statistiken Tabellen] sein

und durch die Art und Weise, Das ist eine schlechte Annahme: So weit ich weiß, dürfen Krüge auch schlagen!

2

Soll wirklich nicht mehr als 3 Tabellen verwendet werden? Normalerweise bedeutet Normalization, dass ein nicht normalisiertes Modell in viele normalisierte Relationen zerlegt wird.

Wenn Sie mehr als drei Tabellen haben können, sollten Sie die folgenden (in 3NF) berücksichtigen:

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

Attribute in [] definieren den Primärschlüssel, sondern ein surrogate key verwendet werden kann, wenn bevorzugt. Das player_id Attribut in Batters and Pitches sollte eine haben, und es sollte auch eine foreign key an die Players-Beziehung sein. Batting_Stats und Pitching_Stats sollten außerdem einen Fremdschlüssel für Batters und Pitching haben.

Beachten Sie jedoch, dass das oben genannte nicht erzwingt, dass ein Spieler nur ein Teig oder nur ein Krug sein kann.


UPDATE:

Eine Methode, die ich bin bewusst zu erzwingen, dass ein Spieler nur ein Teig oder nur ein Krug, ist durch dieses Modell:

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

Die role_type sollte Definieren Sie einen Krug oder einen Teig. Batting_Stats und Pitching_Stats sollten einen zusammengesetzten Fremdschlüssel für Rollen mit (role_id, role_type) haben. Eine eindeutige Einschränkung auf player_id in Rollen würde sicherstellen, dass ein Spieler nur eine und nur eine Rolle haben kann. Schließlich fügen Sie check constraints hinzu, so dass Batting_Stats.role_type = 'Batter' und Pitching_Stats.role_type = 'Pitcher'. Diese Checkbeschränkungen garantieren, dass Batting_Stats immer einen Batter beschreibt, und notieren Sie einen Pitcher. Gleiches gilt für Pitching_Stats.

+0

Es ist mir nicht sofort klar, wie das Einfügen der Tabellen Batters and Pitcher das Datenmodell verbessert oder normalisiert. Diese Tabellen scheinen nur die Daten zu wiederholen, die vorhanden wären, wenn player_id direkt in den Tabellen Batting_Stats und Pitching_Stats verwendet würde. –

+0

@Larry: Diese Tabellen definieren den Satz von Teigen und den Satz von Krügen aus dem "Spielerpool". Das sind * neue Informationen. Dann können Batting-Statistiken nur auf einen Spieler aus dem "Batting Set" und das gleiche auf Pitching beziehen. –

+0

Aber genau die gleiche Information wäre verfügbar, wenn man die Spalte player_id in Batting_Stats und Pitching_Stats untersucht. Ich sehe jedoch einen zusätzlichen Fall, der von deinem Design gehandhabt wird. Er definiert die Rolle eines Spielers in Abwesenheit von Statistiken. Wenn dies erforderlich ist, würden die zusätzlichen Tabellen diesen Bedarf erfüllen (ebenso wie eine zusätzliche Rolle_type Spalte in Players). –

1

Ich weiß, wie ich dies aus einer praktischen Perspektive implementieren würde (ich würde eine UNIONed Ansicht über die disjunkten Tabellen erstellen und einen eindeutigen Index auf die Spieler-ID setzen - daher können sie nur in einer Tabelle erscheinen).

Oder in der Player-Tabelle, welche Art von Statistiken sie haben, und dann in die FK-Beziehung aus den Stats-Tabellen aufnehmen.

Aber beide sind wahrscheinlich näher am Metall als Sie wollen.