我有一个应用程序,其中数据库后端有大约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列是最好的方法吗,还是有更好的方式我没有看到?
答案 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。