1

我正在为轮滑德比联赛做一个数据模型来跟踪他们的比赛。我跟踪诸如单圈时间、每圈罚分、每节罚分和每场比赛罚分之类的事情。

问题是在某些情况下,我只会拥有整体数据;我可能对一场比赛有“每场罚分”,对另一场比赛有“每节罚分”。因此,在最低级别,对于某些比赛,我将拥有非常详细的数据(每次罚分),而在最高级别,我将获得每场比赛的罚分。

当我对某些记录没有详细信息时,我不确定如何建模/使用它来进行报告。我想过这样的事情:

PenaltiesPerMatch MatchID PenaltyCount

PenaltiesPerPeriod MatchID PeriodID PenaltyCount

PenaltiesPerLap MatchID PeriodID LapID PenaltyCount

但我担心的是更高层次的信息可以从低层次得到。我是否重复记录(例如,用每圈罚分的数据填写每个时段的罚分记录,按时段求和?)或保留唯一记录(不要为我已经在罚分中的数据输入每个时段的罚分每圈;通过对周期求和来计算)。

4

3 回答 3

2

我要做的是记录您拥有的信息。对于某些匹配,请详细记录它,而对于其他匹配则要详细记录。

当您报告比赛时:

  • 计算高细节匹配的每场比赛总和
  • 使用来自低细节匹配的每个匹配的总和

以您拥有的最低详细级别存储数据;计算更高的细节级别。

于 2009-05-20T17:44:29.343 回答
1

您可以将信息保存在一个表中,使用 NULL 值表示您没有达到该级别的数据。您将无法在其上放置主键,因此您需要一个代理键,但您应该能够使用唯一约束。

例如:

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

我还没有看到一个简单的解决方案的一个问题是如何强制他们只能进入一个级别的处罚。例如,他们仍然可以这样做:

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)

这种单表解决方案的优点是可以通过查询一个表找到所有统计信息,并且 GROUP BY 可以很好地汇总所有信息。

您也可以使用单独的表格方法,但将视图放在它们之上以将所有内容放在一起。尽管将数字放入多个级别,但这仍然允许上述问题。

于 2009-05-20T18:17:18.077 回答
0

我认为这取决于哪些信息对客户有价值。如果他们想按时期获得信息,那么您应该将其作为单独的记录包含在内。必须区分按时段和按比赛进行的处罚。

我总是受到周期信息的惩罚,然后你可以做一个汇总数据的查询。

如果您的期间始终是一个固定数字,那么您可能只需要在表中做两列而不是一个新表来保存期间信息

于 2009-05-20T17:46:00.743 回答