数据库设计;如何有效地存储周?

时间:2011-12-18 04:32:45

标签: sql database tsql

我需要创建一个表来存储每个人每周在每项任务上工作的小时数。该表将如下所示:

[TaskID] [User] [Week 1] [Week 2] ....... [Week 52]  [Year] 

所以我的问题是,我是否会遇到这种数据库设计的性能问题?我总能找到合适的参考资料。例如,第2周= 2011年1月3日 - 2011年1月9日。

处理闰年的最佳方法是什么?比如2011年12月26日 - 2012年1月1日。我想我可以认为这仍然是2011年的最后一周。

非常感谢任何建议/意见。

谢谢!

4 个答案:

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

使用您在问题中使用的相同格式,我将设置以下三个规范化表格:

USERS

[id] [name]

任务

[id] [description]

HOURS

[id] [task_id] [user_id] [year] [week_no] [hours]

答案 2 :(得分:2)

是的,您将遇到此类设计的性能问题。您将拥有许多完全无用且空白的字段,但每次要进行查询时都必须扫描这些字段。

你最好有这样的结构:

TaskID
User
WeekNumber
Year
Hours

至于你的另一个问题......“闰年”与你提到的日期无关。但我们不一定能回答如何处理这些问题;这更像是一个商业规则 - 企业认为第1周的开始是什么?

答案 3 :(得分:1)