2009-05-03 2 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 

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

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

лучший план у меня есть для достижения этой цели является добавление столбца в каждой таблице поиска для SortOrder (цифровой). У меня был коллега, который сказал мне, что он заставит таблицы нарушать 3-мерную-нормальную форму, но я думаю, что порядок сортировки по-прежнему зависит от ключа и только от ключа (хотя остальная часть списка является алфавитной).

Как добавить столбец SortOrder лучший способ сделать это, или есть лучший способ, которого я просто не вижу?

ответ

4

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

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

1

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

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

Колонки: 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

Thx - В общем, мой поиск ta bles являются «статическими», и самый длинный до сих пор этот образец для округов в 29 рядах. Я не уверен, что вы подразумеваете под «семенем со значением в поле графства».Под этим вы подразумеваете сохранение первых X символов имени в столбце SortOrder? Не могли бы вы предварительно скопировать a, b, c или 1, 2, 3 в строку? –

+0

Значение put «Юта» или «aUtah» проще, чем размещение 5 в столбце порядка сортировки, потому что альфа-значение не относится ни к чему другому, поэтому его можно вставлять напрямую без каких-либо зависимостей от других значений, таких как числовой порядок сортировки. – cletus

0

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

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

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

ORDER BY SortOrder ASC, OtherField ASC 

Другой программист предложил использовать DECODE в Oracle или СЛУЧАЙ отчетность в SQL Server, но это более общее решение. YMMV.

Смежные вопросы