Rub*_*uck 3 normalization database-design date
我有一些数据很难建模。特别是,我不确定如何确保我拥有唯一的数据。这是我将团队分配到商店的时间表。一个团队将连续两天被安排在同一家商店,但我必须确保在给定的时间段(或“周期”)内安排他们不超过 2 天。
数据的电子表格表示如下所示。
Run Code Online (Sandbox Code Playgroud)Cycle Team Store Date 1 1 1 1-Dec 1 1 1 2-Dec 1 1 2 3-Dec 1 1 2 4-Dec 1 1 3 8-Dec 1 1 3 9-Dec 1 1 4 10-Dec 1 1 4 11-Dec 1 2 10 1-Dec 1 2 10 2-Dec 1 2 11 3-Dec 1 2 11 4-Dec 1 2 12 8-Dec 1 2 12 9-Dec 1 2 13 10-Dec 1 2 13 11-Dec
我已经有了一个运行良好的团队/商店交叉引用,但达到这种粒度级别是新的。如果我可以在 Team/Store/Date 上放置一个复合主键会很容易,但我显然不能这样做,或者我只能存储两个预定日期中的一个。
迄今为止,我已经考虑使用具有一对多关系的日期表,从 Team/Store 到现在,但这似乎并没有解决唯一性问题,并增加了一些愚蠢的开销。
有没有人对如何建模有任何建议?
该标签似乎不合适,因为这确实是我问的一个抽象设计问题,但我使用的是 SQL Server 2008。
我认为这可以通过一个额外的列(比如Day
)来完成,该列只允许保存 2 个可能的值(1 和 2)。
假设一个团队不能在同一日期在 2 个或更多商店中,那么您可以在 上有一个UNIQUE
限制(Team, Date)
,另一个在 上(Cycle, Team, Store, Day)
。
约束条件是:
UNIQUE CONSTRAINT uq_1
(Team, Date),
UNIQUE CONSTRAINT uq_2
(Cycle, Team, Store, Day),
CHECK CONSTRAINT ck_max_2_days_per_team_store_cycle
(Day in (1,2))
Run Code Online (Sandbox Code Playgroud)
和数据:
Cycle Team Store Date Day
1 1 1 1-Dec 1
1 1 1 2-Dec 2
1 1 2 3-Dec 1
1 1 2 4-Dec 2
1 1 3 8-Dec 1
1 1 3 9-Dec 2
1 1 4 10-Dec 1
1 1 4 11-Dec 2
1 2 10 1-Dec 1
1 2 10 2-Dec 2
1 2 11 3-Dec 1
1 2 11 4-Dec 2
1 2 12 8-Dec 1
1 2 12 9-Dec 2
1 2 13 10-Dec 1
1 2 13 11-Dec 2
Run Code Online (Sandbox Code Playgroud)