2009-05-20 3 views
1

Ich mache ein Datenmodell für eine Roller Derby Liga, um ihre Spiele zu verfolgen. Ich verfolge Dinge wie Rundenzeiten, Elfmeter pro Runde, Elfmeter pro Spiel und Elfmeter pro Spiel.Datenmodellierung mit Detailgenauigkeit, von denen einige nicht vorhanden sind

Das Problem ist, dass ich in einigen Fällen nur die Gesamtdaten haben werde; Ich könnte "Strafen pro Spiel" für ein Spiel und "Strafen pro Spielzeit" für ein anderes haben. Also auf der untersten Ebene, für einige Spiele, werde ich die sehr detaillierten Daten (Strafen pro Zufall) haben, und auf der höchsten Ebene werde ich Strafen pro Spiel haben.

Ich bin nicht sicher, wie man dies modelliert/verwendet, um Berichte zu erstellen, wenn ich für einige Datensätze keine hohen Details habe. Ich dachte an so etwas wie dieses:

PenaltiesPerMatch PenaltyCount MatchID

PenaltiesPerPeriod MatchID PeriodID PenaltyCount

PenaltiesPerLap MatchID PeriodID Lapid PenaltyCount

Aber meine Sorge ist, dass die Informationen auf höherer Ebene tion kann von niedrigerer Ebene abgeleitet werden. Kann ich Aufzeichnungen vervielfältigen (z. B. einen Rekord für Strafen pro Periode mit Daten, die auch in Strafen pro Runde sind, summiert nach Zeitraum?) Oder einmalige Aufzeichnungen führen (keine Strafen pro Zeitraum für Daten, die ich bereits in Strafen habe) pro Runde; berechnen Sie es durch Summierung auf Zeit).

Antwort

2

Was ich tun würde, ist die Aufzeichnung der Informationen, die Sie haben. Für einige Spiele, nehmen Sie es sehr detailliert auf, für andere wenig detailliert.

Wenn Sie auf die Spiele berichten:

  • die Summen berechnen pro Spiel für die hohe Detailspiele
  • Verwenden Sie die Summe pro Spiel von dem niedrigen Detail passt

Speichern von Daten in der niedrigste Detailstufe, die Sie haben; Berechnen Sie die höheren Detailstufen.

+0

Wie würden Sie mit der Situation umgehen, in der nur Daten auf hohem Niveau vorliegen? In diesem Fall würde eine Berechnung nicht funktionieren. –

+0

Die Berechnung wandelt die sehr detaillierten (pro Quartal) Datensätze in wenig detaillierte (pro Spiel) Datensätze um. Wenn also alles sehr detailliert ist, ist keine Berechnung erforderlich. – Andomar

+0

Ja, aber das OP gibt an, dass er in manchen Fällen keine Low-Level-Daten haben darf, nur die High-Level-Daten. Wenn er nicht immer die niedrigsten Daten hat, kann er die hohen Daten nicht berechnen. –

0

Ich denke, es hängt davon ab, welche Informationen für den Kunden wertvoll sind. Wenn sie die Informationen nach Zeitraum haben möchten, sollten Sie das als separaten Datensatz angeben. Strafe nach Zeitraum und nach Übereinstimmung muss getrennt werden.

Ich hatte Sie immer die Strafe nach Zeitraum Informationen, dann könnten Sie eine Abfrage, die die Daten summiert.

Wenn Ihre Perioden ist immer eine feste Anzahl, dann könnte man wahrscheinlich nur tun zwei Spalten in der Tabelle statt einer neuen Tabelle, die die Periodeninformation

1

Sie könnten die Informationen in einer Tabelle mit NULL-Werten zu halten speichern darauf hinweist, dass Sie die Daten nicht bis zu dieser Ebene haben. Sie wären nicht in der Lage, einen Primärschlüssel darüber zu setzen, also würden Sie einen Ersatzschlüssel benötigen, aber Sie sollten in der Lage sein, eine eindeutige Beschränkung zu verwenden.

Zum Beispiel:

CREATE TABLE PenaltyCounts 
(
    penalty_count_id INT NOT NULL, 
    match_id   INT NOT NULL, 
    period   TINYINT NULL CHECK (period BETWEEN 1 AND 3), 
    lap    SMALLINT NULL, 
    penalty_count SMALLINT NOT NULL, 
    CONSTRAINT PK_PenaltyCounts PRIMARY KEY NONCLUSTERED (penalty_count_id), 
    CONSTRAINT UI_PenaltyCounts UNIQUE CLUSTERED (match_id, period, lap), 
    CONSTRAINT CK_lap_needs_period CHECK (lap IS NULL OR period IS NOT NULL) 
) 

Ein Problem mit diesem, für die ich noch nicht eine einfache Lösung zu sehen ist, wie man erzwingen, dass sie nur Strafen auf einer Ebene eingeben. Zum Beispiel könnten sie dies noch tun:

INSERT INTO PenaltyCounts (penalty_count_id, match_id, period, lap, penalty_count) 
VALUES (1, 1, NULL, NULL, 5) 
INSERT INTO PenaltyCounts (penalty_count_id, match_id, period, lap, penalty_count) 
VALUES (2, 1, 1, NULL, 3) 
INSERT INTO PenaltyCounts (penalty_count_id, match_id, period, lap, penalty_count) 
VALUES (3, 1, 2, NULL, 2) 

Der Vorteil dieser Single-Table-Lösung ist, dass Sie Ihre Statistiken können alle durch Abfragen einer Tabelle und die GROUP BYs alles nach oben rollen schön finden.

Sie könnten auch die separate Tabelle Methode verwenden, aber Ansichten über sie, um alles zusammen zu ziehen. Dies ermöglicht immer noch das oben beschriebene Problem, Zahlen auf mehrere Ebenen zu setzen.

Verwandte Themen