数据建模具有详细程度,其中一些不存在

时间:2009-05-20 17:38:50

标签: sql datamodel

我正在为一场轮滑德比联赛做一个跟踪他们比赛的数据模型。我跟踪比赛时间,每圈点球数,每个点数的罚分以及每场比赛的点球数。

问题在于,在某些情况下,我只会获得整体数据;对于一场比赛,我可能会有“每场比赛的罚球”,而对于另一场比赛我可能会受到“每个赛段的罚分因此,在最低级别,对于某些比赛,我将获得非常详细的数据(每次点球的罚分),并且在最高级别我将对每场比赛进行处罚。

当我没有一些记录的高细节时,我不确定如何建模/使用它来进行报告。我想到了这样的事情:

PenaltiesPerMatch MatchID PenaltyCount

PenaltiesPerPeriod MatchID PeriodID PenaltyCount

PenaltiesPerLap MatchID PeriodID 拉彼德 PenaltyCount

但我担心的是,较高级别的信息可以从较低级别获得。我是否重复记录(例如,每个时期的罚款记录,每周的罚分数,按期间总计?)或保留唯一记录(不要对我已经处罚的数据按期间处罚)每圈;通过总结期间来计算。)

3 个答案:

答案 0 :(得分:2)

我要做的是记录您拥有的信息。对于某些比赛,请将其记录得非常详细,其他部分则要详细记录。

报告比赛时:

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

以最低的详细程度存储数据;计算更高的细节水平。

答案 1 :(得分: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将很好地推送所有内容。

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

答案 2 :(得分:0)

我认为这取决于哪些信息对客户有价值。如果他们希望按期间获得信息,那么您应该将其作为单独的记录包含在内。按期间和匹配的处罚必须分开。

我总是按期间信息处罚,然后你可以做一个对数据求和的查询。

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