数据库设计:查找表的排序顺序

时间:2009-05-03 02:13:03

标签: database language-agnostic database-design

我有一个应用程序,其中数据库后端有大约15个查找表。例如,有一个像这样的县的表:

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

此应用的用户界面在这些查找表的各个位置都有许多组合框,我的客户在这种情况下要求列出框:

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

我实现这一目标的最佳方案是为SortOrder(数字)的每个查找表添加一列。我有一位同事告诉我他认为这会导致表违反3rd-Normal-Form,但我认为排序顺序仍然取决于键和键(即使列表的其余部分是按字母顺序排列)。

添加SortOrder列是最好的方法吗,还是有更好的方式我没有看到?

3 个答案:

答案 0 :(得分:4)

我同意@cletus,排序顺序列是一个好方法,它不违反3NF(因为,正如你所说,排序顺序列条目在功能上依赖于表的候选键)。 / p>

我不确定我是否同意字母数字比数字更好。在县的特定情况下,很少创建新的。但并不要求分配的数字是连续的;例如,你可以用数百的数字来分配它们,留下足够的空间用于插入。

答案 1 :(得分: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')

可以说你可能想要放入另一个标记列来表示这些条目是特殊的。

答案 2 :(得分:0)

我选择了数字和大倍数。

即使使用CONCAT('E-'示例,我也没有得到所需的排序顺序。这会让我戴维斯,SL,Tooele ......并且盐湖需要首先。

我最终使用了10的倍数,并为非特殊排序条目分配了类似10000的值。这样每个查找的视图都可以有

ORDER BY SortOrder ASC, OtherField ASC

另一位程序员建议在Oracle中使用DECODE,或在SQL Server中使用CASE语句,但这是一种更通用的解决方案。 YMMV。