2009-05-03 79 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。