2011-12-18 87 views
1

我需要創建一個表來存儲每個人在每個任務上每週工作的小時數。該表將是這樣的:數據庫設計;如何有效存儲星期?

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

所以我的問題是,我會碰上這樣的數據庫設計性能問題?我總是可以找到正確的參考。例如第2周= 2011年1月3日 - 2011年1月9日。

閏年的最佳處理方法是什麼?像2011年12月26日 - 2012年1月1日。我想我可以考慮這仍然是2011年的最後一週。

任何意見/建議將不勝感激。

謝謝!

+1

我不明白你的插圖。如果這些表示列名稱,那麼這是一個糟糕的數據庫設計。 – jamieb 2011-12-18 04:36:10

回答

4

這是非常規格化的數據,不推薦。數據意味着增長減少而不是輸出。這樣的事情將是可取的:

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 
+0

你甚至可以使用'TaskId' -UserId'''Date'''NumberOfHours'結構化表格,然後創建一個按周累計時間的視圖。 – slugster 2011-12-18 04:43:29

+0

@slugster同意,有很多方法來處理這種設計,這也是一個很好的方法。 – 2011-12-18 04:44:23

+0

「非常規格化的數據」 - 注意說明你認爲它是哪種正常形式,爲什麼?提示:您可能誤解了[在1NF的情況下重複的組是真的意味着什麼](http://www.simple-talk.com/content/print.aspx?article=712)。 – onedaywhen 2011-12-19 11:09:50

2

使用你在你的問題中常用的格式,我將設立以下三個規範化表:

USERS

[id] [name] 

任務

[id] [description] 

小時

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

是的,你會遇到性能問題有這樣的設計。您將擁有許多完全無用且空白的許多字段,但每次您想要執行查詢時都必須進行掃描。

你會好起來有這樣的結構:

TaskID 
User 
WeekNumber 
Year 
Hours 

至於你的其他問題......「閏年」無關,與你提到的日期。但我們不一定能回答如何處理這些問題。這更像是一種商業規則 - 企業認爲這是第一週的開始?

相關問題