我需要创建一个表来存储每个人每周在每项任务上工作的小时数。该表将如下所示:
[TaskID] [User] [Week 1] [Week 2] ....... [Week 52] [Year]
所以我的问题是,我是否会遇到这种数据库设计的性能问题?我总能找到合适的参考资料。例如,第2周= 2011年1月3日 - 2011年1月9日。
处理闰年的最佳方法是什么?比如2011年12月26日 - 2012年1月1日。我想我可以认为这仍然是2011年的最后一周。
非常感谢任何建议/意见。
谢谢!
答案 0 :(得分:4)
这是非常规非常化的数据,不推荐使用。数据意味着 down 而不是 out 。这样的事情是可取的:
create table YourWeeks
(
TaskID int identity(1, 1) not null,
User varchar(100) not null,
Week varchar(100) not null,
WeekEnum int not null,
Year int not null,
constraint ck_weeknum check (WeekEnum between 1 and 52)
)
go
为了处理闰年,您可以使用外键引用,例如:
create table Years
(
Year int not null,
IsLeapYear bit not null
)
go
alter table YourWeeks
add constraint fk_weeks foreign key (Year) references Years (Year)
go
答案 1 :(得分:2)
使用您在问题中使用的相同格式,我将设置以下三个规范化表格:
[id] [name]
[id] [description]
[id] [task_id] [user_id] [year] [week_no] [hours]
答案 2 :(得分:2)
是的,您将遇到此类设计的性能问题。您将拥有许多完全无用且空白的字段,但每次要进行查询时都必须扫描这些字段。
你最好有这样的结构:
TaskID
User
WeekNumber
Year
Hours
至于你的另一个问题......“闰年”与你提到的日期无关。但我们不一定能回答如何处理这些问题;这更像是一个商业规则 - 企业认为第1周的开始是什么?
答案 3 :(得分:1)