2009-05-03 51 views
1

我有一個應用程序,其中數據庫後端有大約15個查找表。比如有像這個縣的表:DB Design:查找表的排序順序

CountyID(PK) County 
49001  Beaver 
49005  Cache 
49007  Carbon 
49009  Daggett 
49011  Davis 
49015  Emery 
49029  Morgan 
49031  Piute 
49033  Rich  
49035  Salt Lake 
49037  San Juan  
49041  Sevier 
49043  Summit 
49045  Tooele 
49049  Utah  
49051  Wasatch 
49057  Weber 

爲這個應用程序的UI擁有一批在不同的地方,這些查找表的組合框,和我的客戶要求,在這種情況下,盒列表:

CountyID(PK) County 
49035  Salt Lake 
49049  Utah 
49011  Davis 
49057  Weber 
49045  Tooele  
'The Rest Alphabetically 

我已經完成這項工作的最佳方案是爲SortOrder(數字)的每個查找表添加一列。我有一位同事告訴我他認爲這會導致表違反3rd-Normal-Form,但我認爲排序順序仍然取決於鍵和鍵(即使列表的其餘部分是按字母順序排列的)。

添加SortOrder列是做這件事的最好方法,還是有更好的方法,我只是沒有看到?

回答

4

我同意@cletus的排序順序列是一個好方法,它不違反3NF(因爲,正如你所說,排序順序列條目在功能上依賴於表的候選鍵)。

我不確定我是否同意字母數字比數字更好。在縣的具體情況下,很少創建新的。但是並不要求所分配的數字是連續的;您可以將它們分配爲數百倍的數字,例如,爲插入留下足夠的空間。

1

是的我同意排序順序列是最好的解決方案,當需求調用自定義排序順序,如你所引用的。然而,我不會使用數字列。如果數據是字母數字,則排序順序應該是字母數字。這樣你就可以用縣域裏的任何東西來種子。

如果您使用數字字段,則每當添加新條目時都必須重新排序整個表(可能)。所以:

列:ID,縣,SortOrder的

種子:

UPADTE County SET SortOrder = CONCAT('M-', County) 

和特殊情況:

UPDATE County 
SET SortOrder = CONCAT('E-' . County) 
WHERE County IN ('Salt Lake', 'Utah', 'Davis', 'Weber', 'Tooele') 

可以說,你可以把它放到另一個標記列中表明這些條目是特殊的。

+0

Thx - 一般來說,我的查找ta Bles是'靜態',迄今爲止最長的是29行縣的樣本。我不確定'種子在縣域的價值'是什麼意思。那麼您是說將名稱的前X個字符存儲在SortOrder列中?你會預先將a,b,c或1,2,3連接到字符串嗎? – 2009-05-03 02:25:10

0

我去了數字和大倍數。

即使有CONCAT(「E-」 ..例如,我沒有得到所需的排序順序,這會給我戴維斯,SL,圖埃勒...和鹽湖首先需要。

我結束了使用10的倍數,並指派非特殊類型的條目像10000這樣的數值爲每個查找視圖可以有

ORDER BY SortOrder ASC, OtherField ASC 

在Oracle中使用DECODE另一個程序員建議,或CASE語句SQL Server,但這是一個更一般的解決方案。YMMV。