Frage

Ich bin die Speicherung von Daten auf Baseball-Statistiken und möchte so mit drei Tabellen tun: Spieler, battingStats und pitchingStats. Für die Zwecke der Frage, wird jeder Spieler der Wimper Statistiken hat oder Pitching Statistiken, aber nicht beide.

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

War es hilfreich?

Lösung

playerid wäre ein Fremdschlüssel sowohl in BattingStats und PitchingStats Tabellen

[und erinnere mich an einige Zeitdimension zu setzen (Jahreszeit, Jahr, et al) in den Statistiken Tabellen]

und durch die Art und Weise, dies ist eine schlechte Annahme: soweit ich weiß, Krüge zu schlagen sind erlaubt, zu

Andere Tipps

Müssen Sie wirklich nicht mehr als 3 Tabellen zu verwenden. Normalisierungs bedeutet normalerweise nach unten ein nicht-normalisierte Modell in viele normalisierte Beziehungen.

brechen

Wenn Sie mehr als drei Tabellen haben können, sollten Sie Folgendes berücksichtigen (in 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, ...)

Attribute in [] den Primärschlüssel definieren, sondern ein Ersatzschlüssel verwendet werden kann, wenn bevorzugt . Das player_id Attribut in Batters und Plätzen sollte eine eindeutige Einschränkung , und es sollte auch eine sein < a href = "http://en.wikipedia.org/wiki/Foreign_key" rel = "nofollow noreferrer"> Fremdschlüssel zum Spieler Beziehung. Batting_Stats und Pitching_Stats sollten auch jeweils einen Fremdschlüssel zu Batters und Pitching haben.

Beachten Sie jedoch, dass die oben erzwingt nicht, dass ein Spieler nur ein Batter sein kann oder nur ein Krug.


UPDATE:

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

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 sollten einen Krug oder einen Teig definieren. Batting_Stats und Pitching_Stats sollen einen Verbundfremdschlüssel zu Rollen mit (role_id, role_type) haben. Eine eindeutige Einschränkung auf player_id in Rollen würde sicherstellen, dass ein Spieler nur einen haben kann, und nur eine Rolle. Schließlich fügen Sie Check-Einschränkungen so dass Batting_Stats.role_type = 'Batter' und Pitching_Stats.role_type = 'Pitcher'. Diese Check-Constraint Garantie, dass Batting_Stats beschreibt immer einen Teig, und einen Krug beachten. Das gleiche gilt für Pitching_Stats.

Ich weiß, wie ich dies aus praktischer Sicht implementieren würde (ich einen unioned Blick über die disjunkten Tabellen erstellen würde und einen eindeutigen Index für den Spieler-ID setzen - sie können daher nur in einer Tabelle angezeigt werden).

oder in der Spieler-Tabelle, Aufzeichnung, welche Art von Statistiken die sie haben, und dann schließen, dass in der FK-Beziehung aus den Statistik-Tabellen.

Aber entweder von diesen ist wahrscheinlich näher an das Metall als Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top