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同意,有很多方法可以实现此设计,这也是一个很好的方法。“非常非规范化的数据”--请说明您认为它是哪种标准形式,以及为什么?提示:您可能误解了。