Красивые адреса - изобретаем велосипед, опираясь на современные тенденции

Реализация красивых адресов сайта обычно выглядит так: добавляем в таблицу уникальное поле path, которое будет хранить валидный адрес, а потом делаем по нему выборку.

Минусы очевидны:
1) SELECT по текстовому полю.
2) В случае нескольких баз данных мы не можем предположить какая из них содержит нужную нам запись.
3) Дополнительное идентификационное поле в то время, как уже есть основное, обычно, ID.

Избавляемся от минусов одним выстрелом и находим другие.

Оставляем только ID. А как же красивые адреса? Используем конвертацию в другую систему счисления. В принципе, достаточно тридцатишестиричной (36) системы счисления, которая содержит строчные буквы латинского и цифры.

Тогда:

0 = 0
z = 35
news = 1092412
about = 17341589

По-моему, здорово. Такое уже есть в сокращалках ссылок.

Ограничение — это максимальное числовое значение. Для UNSIGNED BIGINT в MySQL это 18446744073709551615, что также является UNSIGNED INT64 в нормальных языках программирования.

Отдельно отмечу, что PHP безразлично относится к точности чисел о чем и сообщают в документации, так что трогать его не надо:


Еще одно замечание, которое впрочем лишь косвенно относится к теме. После ручной вставки числового ID в поле с AUTO_INCREMENT, тот будет уже следовать за этим числом, какое большое бы оно не было, так как изменять его можно только на большее, но не меньшее.
  • 0

4 комментария

avatar
  • MpaK
  • 0
Хм, странно, но «уникальное поле path» я никогда так не делал. Обычно дерево лежит в базе же, там все равно выбирать надо из путей. При материализованном пути очень дико надо обходить и перестраивать, хотя есть конечно плюсы.

А из минусов: 1) тоже можно индекс делать 2) можно свои правила ввести, например всё что начинается с первой буквы а-j в базе1, а другое в базе2 :) 3) поле id в любом случае делаю, для orm и т.п. чтобы не переназначать primary key

Кстати, если выбран такой путь, почему бы не сделать это поле varchar(128) например с индексом и не хранить просто адрес sha1($url), без иных перекодировок, разница в скорости выборке будет ну просто не ощутимая :)
avatar
Черт, ну тогда не знаю зачем оно нужно))) Наверное, чисто теоретически, да и просто вспомнить о 36-ной системе. Выглядит гиковски.
avatar
  • MpaK
  • 0
Гиковски это точно :) крутяцкое извращение

Хотя каюсь, я вот тут одну фигнюшку писал от свободного времени wiki.mrak7.com так тоже пути храню сразу материализованные, так как обычно переносов тут не бывает страниц из вложенности. Гык и извратно местами делаю select с регулярным выражением. УжасЪ :)
avatar
Я возьму таймаут на придумывание следующего извращения)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.