2012-03-29 206 views
3

我正在創建一個應用程序,其中對象具有狀態查詢。爲了給出一些上下文,我們使用下面的例子。數據庫最佳實踐 - 狀態


其中作業創建,通過以下流程移動一個服務檯應用程序:

- 工作創建,但是未分配
正在進行 - 工作分配給工人,正在進行
完成 - 作業已準備好開具發票
已關閉 - 作業開具發票


所以,我創建一個狀態表具有以下細節:

INT ID
名稱

,並在工作表中查找列

int ID
名稱
INT客戶ID
INT StatusID - >查找狀態

因此,在現實世界中,假設我們有以下要求。

  1. 用戶需要獲得一份報告,顯示所有未完成的作業(作業這是新的或INPROGRESS)
  2. 的路線,有人會想補充一點,在中間坐着一個新的狀態完成和結束例如。
考慮到這一點

所以,我最初的想法是創建名爲SortOrder的或類似的狀態表中的新列和編號分配給它,如

- 10
進行中 - 20
完成 - 30
關閉 - 40

這意味着對於上面的案例#1,我可以簡單地查詢數據庫中所有狀態大於或等於30的作業。這對情況#2也很有用,因爲這意味着如果我引入了新狀態在完成和關閉之間它不會打破這個報告。

我可以看到它會經常出現在不同的應用程序中。有沒有人實施過這樣的解決方案或之前遇到過這個問題?

+0

保留已棄用的數據(如已關閉的作業)將開始降低查詢速度,並引入相當於不斷刪除死記錄的邏輯。 – 2012-03-29 05:10:22

+1

已關閉並不一定代表已棄用。就幫助臺系統而言,允許技術人員回顧客戶的工作經歷可以提供很多真實世界的使用。 – 2012-03-29 07:35:49

+0

隨着系統逐漸成熟,數據庫將保留大量過時的數據,無法安全地遷移數據。儘早設計此遷移可以幫助系統優雅地老化。我從來沒有說過要擺脫這些數據,只是爲了不把它保留在查詢速度很重要的主表中。此外,您可能希望使用日期而不是代碼的值,這樣您可以跟蹤每個活動的持續時間。爲代碼添加額外的表可能會節省幾行,但這會增加功能。 – 2012-03-29 07:54:32

回答

0

我們所做的只有一個狀態表和一個伴隨狀態組表。

create table status_group (
    id integer primary key not null, 
    alias varchar(20) not null, 
    descr varchar(128) 
) 

create table status (
    id integer primary key not null, 
    status_group_id integer, 
    alias varchar(20) not null, 
    descr varchar(128) 
) 

然後,所有的狀態都住在一個地方,而是VS有無數個別組合在一起。

+0

感謝您的回答,我不太明白。我的情況如何使用? – 2012-03-29 07:34:10