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

Sql 数据库设计;如何有效地存储周数?,sql,database,tsql,Sql,Database,Tsql,我需要创建一个表来存储一个人每周在每个任务上工作的小时数。该表将如下所示: [TaskID] [User] [Week 1] [Week 2] ....... [Week 52] [Year] TaskID User WeekNumber Year Hours 所以我的问题是,这样的数据库设计会导致性能问题吗?我总能找到正确的星期参考号。e、 g第2周=2011年1月3日至2011年1月9日 处理闰年的最佳方式是什么?如2011年12月26日至2012年1月1日。我想我可以把它看作是20

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

[TaskID] [User] [Week 1] [Week 2] ....... [Week 52]  [Year] 
TaskID
User
WeekNumber
Year
Hours
所以我的问题是,这样的数据库设计会导致性能问题吗?我总能找到正确的星期参考号。e、 g第2周=2011年1月3日至2011年1月9日

处理闰年的最佳方式是什么?如2011年12月26日至2012年1月1日。我想我可以把它看作是2011的最后一周。 如有任何意见/建议,将不胜感激


谢谢

这是非常非规范化的数据,不推荐使用。数据意味着增长而不是消失。这样做是明智的:

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

这是非常非规范化的数据,不推荐使用。数据意味着增长而不是消失。这样做是明智的:

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

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

使用者 任务 小时
使用您在问题中使用的相同格式,我将设置以下三个标准化表:

使用者 任务 小时
是的,这样的设计会导致性能问题。您将有很多字段,这些字段完全无用且为空,但您必须在每次执行查询时扫描这些字段

你最好有这样一个结构:

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

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

P是的,你会遇到这样一个设计的性能问题。您将有很多字段,这些字段完全无用且为空,但您必须在每次执行查询时扫描这些字段

你最好有这样一个结构:

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

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

P>建议:使用。< /P> < P>建议:使用。< /P>我不明白你的插图。如果这些代表列名,那么这是一个糟糕的数据库设计。我不理解你的说明。如果这些代表列名,那么这是一个糟糕的数据库设计。您甚至可以使用
TaskId
-
UserId
-
日期
-
NumberOfHours
结构化表,然后创建一个按周对累计时间进行分组的视图。@slugster同意,有很多方法可以实现此设计,这也是一个很好的方法。“非常非规范化的数据“--请说明您认为它是哪种标准形式,以及为什么?提示:您可能误解了。您甚至可以使用
TaskId
-
UserId
-
Date
-
NumberOfHours
结构化表,然后创建一个按周分组累计时间的视图。@Slaster同意,有很多方法可以实现此设计,这也是一个很好的方法。“非常非规范化的数据”--请说明您认为它是哪种标准形式,以及为什么?提示:您可能误解了。