2010-11-02 52 views
1

我正在爲許多員工設計一個計劃系統,以便在家中全天候工作。當用戶計劃新事件(1小時長的事件,從小時開始,24小時選擇)時,系統需要允許我們的用戶選擇他們想爲他們工作的員工。我需要報告那個時間可用的人員。我們有超過100名員工,他們的可用性變化頻繁。每週員工可用性數據庫設計

調度表:
EventID EmployeeID
startTime (datetime)
endTime (datetime)

可用性表:
EmployeeID
00:00
01:00
02:00
03:00
...
23:00

記錄在可用性表被存儲爲一個varchar(7)。 7的長度是每週的每一天。從未在此時間段提供'0000000'。總是在這個時間段是'1111111'。此時間段的星期二可用「0010000」。

編輯:此信息爲一個星期,因此7個字符的長度。從本週到無窮遠,這個表格設計假設員工每週都會在同一時間工作(除非他們在工作)。當然,員工可以改變他們的可用性,然後表格可以反映從那時起的那些變化。 /編輯

找出在任何給定時間員工可用的東西需要大量的循環,這顯然會使系統陷入沉寂,對任何人都不利。

這是我拿出來實行這個制度的最佳方式,短的可能有一個表來存儲每個員工的可用性。我意識到我是一個可怕的方法。有人可以請指點我正確的方向嗎?

回答

1

有不同的表來存儲員工的可用性。我不明白你爲什麼不應該。

您應該始終避免將多個數據字段放入一列(如您的varchar列)。我爲每位員工提供一行,時段和日期。這樣你就可以通過索引加速查詢。


即使你保持你的醜陋「的所有功能於一身的列辦法」應更改爲CHAR因爲現在你使用了每行一個字節,僅保留的大小列,即使它總是7個字符長。或者更好的是,使用TINYINT(1字節)並將可用性存儲爲二進制標誌。但是,當然,不惜一切代價避免這一點 - 你真的想要normalize你的數據庫。

+0

大點,你可以到期了。你的意思是爲每個員工的可用性創建一個新表? – 2010-11-02 12:24:42

+0

不,當然不是。我的意思是爲所有員工提供一張桌子。 – 2010-11-02 14:53:12

+0

嗯,我不認爲我明白你的意思。我目前有一張表供所有員工使用。活動日程安排在單獨的表格中。和BTW,我已經改變爲CHAR數據類型,感謝小費 - 但正如你所說的,直到我更改表設置,這只是一個短期的修復! – 2010-11-03 03:10:18

2

我想你可能會更好存儲每個用戶的可用性,它實際上並沒有那麼多的數據,再加上一旦它通過了:

create table employee (
    `id` TINYINT(3) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT 
); 

create table `employee_availability` (
    `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `employee_id` TINYINT(3) UNSIGNED NOT NULL, KEY `employee`(`employee_id`), 
    `start_time` DATETIME, KEY `start`(`start_time`), 
    `end_time` DATETIME, KEY `end`(`end_time`) 
); 


SELECT e.* FROM employee 
    JOIN employee_availability ea ON ea.employee_id = e.id 
WHERE NOW() between start_time and end_time 
+0

我完全理解你的答案,謝謝。我並沒有像原本應該清楚的那樣清楚(問題現在已經被編輯過),可用性將每週重複一次。而且我需要知道員工何時可以提前幾個月獲得服務,因此我無法將此信息存儲爲特定的DATETIME數據。我想不出有辦法做到這一點,但是你的建議是否可能只是「一週中的每一天」和「時間」數據?我不知道如何構建SQL。 – 2010-11-02 10:13:09

+0

嘿,本,我只是做一些估計,我認爲這個答案將仍然有效。形象化你的公司有150名員工,他們將每天存儲10次不同的可用時間,爲期56天(8周),這是84000行不同的行。我不認爲查詢運行緩慢。 – 2010-11-02 13:48:12

+0

感謝Logan。我同意查詢不會成爲負擔......但這些84000行從哪裏來?我不能要求員工每週填寫他們的空缺情況。如果他們一次指定可用性,那就應該是這樣。我將您的解決方案視爲我的(有缺陷的)可用性表的並行表,並在每週結束時運行一個cron作業來填充您的(更好,更快)可用性表。這肯定會減少服務器負載,但它有明顯的數據冗餘問題,並且仍然需要我的原始表格。 – 2010-11-03 03:29:31