您可以将信息保存在一个表中,使用 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 可以很好地汇总所有信息。
您也可以使用单独的表格方法,但将视图放在它们之上以将所有内容放在一起。尽管将数字放入多个级别,但这仍然允许上述问题。