代码之家  ›  专栏  ›  技术社区  ›  Gary.Ray

DB设计:查找表的排序顺序

  •  1
  • Gary.Ray  · 技术社区  · 15 年前

    我有一个应用程序,其中数据库后端有大约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(数字)的每个查找表添加一列。我有一位同事告诉我,他认为这会导致表违反第三范式,但我认为排序顺序仍然取决于键,而且只取决于键(即使列表的其余部分是按字母顺序排列的)。

    添加SortOrder列是实现这一点的最佳方法,还是有更好的方法我只是没有看到?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Jonathan Leffler vy32    15 年前

    我同意@cletus的观点,排序顺序列是一种很好的方式,它不会违反3NF(因为,正如您所说,排序顺序列条目在功能上依赖于表的候选键)。

    我不确定我是否同意字母数字比数字好。就县的具体情况而言,很少创建新的县。但不要求分配的数字是连续的;例如,您可以使用100的倍数来分配它们,为插入留出足够的空间。

        2
  •  1
  •   cletus    15 年前

    是的,我同意当需求需要定制排序顺序时,排序顺序列是最好的解决方案,就像您引用的那样。然而,我不会选择数字列。如果数据为字母数字,则排序顺序应为字母数字。这样,您就可以使用county字段中的任何内容来播种值。

    如果使用数字字段,则每当添加新条目时,都必须(可能)对整个表重新排序。因此:

    种子:

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

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

    可以说,您可能希望在其中添加另一个标记列,以表明这些条目是特殊的。

        3
  •  0
  •   Gary.Ray    15 年前

    我选择了数字和大倍数。

    即使使用CONCAT('E-')示例,我也没有得到所需的排序顺序。这将给我Davis、SL、Toole…和盐湖城需要第一个。

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

    ORDER BY SortOrder ASC, OtherField ASC