Дизайн БД: порядок сортировки для таблиц поиска - PullRequest
1 голос
/ 03 мая 2009

У меня есть приложение, в котором у базы данных около 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 ]

4 голосов
/ 03 мая 2009

Я согласен с @cletus, что столбец порядка сортировки - это хороший способ, и он не нарушает 3NF (поскольку, как вы сказали, записи столбца порядка сортировки функционально зависят от ключей-кандидатов таблицы). 1001 *

Я не уверен, что согласен с тем, что алфавитно-цифровой лучше, чем числовой. В конкретном случае округов создаются новые редко. Но не требуется, чтобы назначенные номера были последовательными; Вы можете присвоить им числа, кратные сотне, например, оставляя достаточно места для вставок.

1 голос
/ 03 мая 2009

Да, я согласен, что столбец порядка сортировки - лучшее решение, когда требования требуют настраиваемого порядка сортировки, подобного тому, который вы приводите. Я не пошел бы с числовым столбцом как бы то ни было. Если данные являются буквенно-цифровыми, порядок сортировки должен быть буквенно-цифровым. Таким образом, вы можете посеять значение с тем, что находится в поле округа.

Если вы используете числовое поле, вам придется повторно упорядочивать всю таблицу (потенциально) каждый раз, когда вы добавляете новую запись. Итак:

Столбцы: ID, округ, SortOrder

Seed:

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

и для особых случаев:

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

Возможно, вы захотите поместить другой столбец маркера, чтобы указать, что эти записи являются специальными.

0 голосов
/ 04 мая 2009

Я пошел с числовыми и большими коэффициентами.

Даже с CONCAT (пример 'E-' .., я не получаю требуемый порядок сортировки. Это дало бы мне Дэвиса, SL, Tooele ... и Солт-Лейк должен быть первым.

В итоге я использовал кратные 10 и присвоил элементам не специальной сортировки значение, например, 10000. Таким образом, представление для каждого поиска может иметь

ORDER BY SortOrder ASC, OtherField ASC

Другой программист предложил использовать DECODE в Oracle или операторы CASE в SQL Server, но это более общее решение. YMMV.

...