Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Методы сортировки смешанных данных (текст + числа)

#база_данных #сортировка #алгоритм

                    
Какие есть способы сортировки данных типа:

Профессиональное училище № 21
Профессиональное училище № 30
Профессиональное училище № 120

или:

pgAdmin v1.8.4
pgAdmin v1.10.5
pgAdmin v1.12.3

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


Ответы

Ответ 1



имхо у вас проблема не с сортировкой данных а с проэктированием СУБД. значения то неатомарные, - посему должна иметь место оптимизация и разбиение данных на 2 поля: имя + номер или продукт + версия если вы не слышали ничего про реляционные СУБД (втч. про нормальные формы) есть и для вас пару вариантов: для всех полей которые являются комплексными нужно добавить по одному numeric полю в таблицу. и на вставку/обновление повесить триггер который будет для каждого такого поля заполнять соответствующие им поля _order. которые и будут использоватся для сортировки. или же сами можете заполнять при вставке. (имеет смысл хранить эти данные в отдельной таблице) можно добавить функцию которая будет подсчитывать order для сортировки на лету. выглядеть это будет как-то так: 1) select x.afield from xtable x order by get_order (x.afield) или 2) select x.afield from xtable x order by get_order ('xtable', 'xfield', x.afield) настройки для функции get_order могут хранится в какой-то отдельной таблице. в первом примере вам придется автоматически определять шаблон который использовать для определения порядка следования записи, в другом примере вы сможете с помощью if elseif... использовать алгоритм в зависимости от входных данных. первый вариант более предпочтительный с точки зрения performance. а правильный, - оптимизация структуры СУБД UPDATE: с одной стороны полное имя учебного заведения это вроде как-бы единое значение. но это только на первый взгляд. "профессиональное" (опциональный префикс, - можно игнорировать) "училище" - тип учебного заведения (академия, институт, университет) может быть использовано для сортировки "№ 43" - номер учебного заведения. "Санкт Петербурга" - явно же город. "имени" васи пупкина - даж незнаю как атрибут назвать но "имени" явно можно использовать для фильтра, - только есть ли смысл, - хз. далее логически анализируем данные: номер учебного заведения + его тип = уникальная комбинация (в пределах одного города) учебное заведение может быть расположено только в одном городе, во всех остальных будут филиалы. хотя называтся могут одинаково. т.е комбинация этих 3х полей не будет уникальной. в результате получается таблица следующего содержимого: id // уникальный id type, // профессиональное училище / университет / академия. можно вынести в отдельную таблицу number, // порядковый номер. его в принцыпе может и не быть. (это надо учесть в сортировке) dedication_id // поле которое будет хранить ссылку на id человека которому посвящено. если null - то никому не посвящено. null тоже можно учесть при сортировке foundation_date // время когда было создано учебное заведение. имхо это важное поле. description // или full_name/display_name - полное имя заведения, то которое вы будете отображать пользователю. и которое никогда не будет участвовать в сортировке. location_id // ссылка на таблицу с местоположениями (ессно будет содержать город) p.s. пожалуй еще лучше было бы создать отдельную таблицу отделения или филиалы. привязанную к конкретному учебному заведению. где каждый отдельный филиал имеет свой конкретный адресс. что позволит хранить данные независимые от других филиалов. напр: количество студентов/наличие кафедр/специальностей итд итп таблица dedication id, // уникальное id prefix, // его величество name, // василий пупкин ^^ таблица нужна, т.к. одному ученому может быть посвящено больше чем 1 заведение. p.s.s если обобщить одной фразой работу с субд: легко проэктировать = сложно работать и наоборот.

Комментариев нет:

Отправить комментарий