Микроформаты

Микроформаты это небольшие дополнения к элементам html от Mozilla, Google и других широкоизвестных компаний. Некоторые указывают браузеруFirefox, некоторые — поисковикам, плагинам типа Operator extension о характере данных, и что их можно использовать в других приложениях.

MySQL триггеры на страже скорости и целостности

Недавно начал использовать триггеры в БД. Полезная штука. Первый случай использования — валидация данных. Позволяет на уровне БД сохранять транзитивную целостность, т.е. более глубокую проверку, чем просто существующий foreign key. Вот простейший пример. Есть три таблички — site, category, article. При добавлении нового ряда в article, мы хотим проверить что categoryID […]

Транзакции InnoDB

InnoDB это транзакционный, реляционный движок работающий на основе MySQL сервера. Начиная с 2001 года он поставляется в стандартной сборке, а с версии 5.1 может устанавливаться в качестве плагина (без необходимости перекомпилировать ядро сервера). Синтаксис очень простой. START TRANSACTION; … COMMIT; — или же ROLLBACK; если что-то пошло в логике не […]

Морфологический поиск

Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда надо найти нечёткое соответствие — когда среди документов есть Киевская карта но нету Карты Киева? Надо окунаться в текст и язык. Любое сообщение на естественном языке можно рассматривать по глубине и этим занимаются разные разделы […]

Полнотекстовый межтабличный поиск для InnoDB

Предлагаю решить интересную SQL-задачу. Думаю у среднего девелопера она займёт пол часа или больше (я же сразу спросил у SQL-гуру). Возникла интересная задача при переходе с MyIsam на InnoDB. Как известно, полнотекстовый поиск у последнего движка отсутсвует, поэтому было два решения — делать обычное зеркало на MyIsam где был бы […]

Возраст и день рождения через SELECT

Иногда хочется быстро вычислить сколько дней до дня рождения пользователя. Вы все видели это в Одноклассниках и ЖЖ. Это можно делать в запросе например таким образом для mysql 5 SELECT TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) years_old, TIMESTAMPDIFF(DAY, NOW(), DATE_ADD(users.birth_date, INTERVAL 1+TIMESTAMPDIFF(YEAR,users.birth_date,NOW()) YEAR)) next_birth_days FROM users Нашёл в своём стареньком коде, может кому полезно будет..

Mysql rownum

Есть таблица меню в БД с полем порядка order_id, но порядок неправильный и надо порядок обновить по алфавиту другого поля title. Сортировка по полю title исключается, потому что таблица представляет из себя иерархическое меню, где порядок может менять пользователь устанавливая order_id. Использовать отдельно серверную обработку (php) тоже невыгодно — лишнее разделение […]

Mysql prepared statements

Подготовленные запросы имеются в MySQL начиная с 4.1 и нужны по трём причинам. Скорость. Если вы выполняете однообразные запросы, то mysql парсеру каждый раз приходится выполнять распознавание — какой тип запроса, какие данные передаются и тому подобное. Если сделать прототип запроса, а в последствии передавать только данные, то ясное дело […]

Random order в Postgre

Как-то я писал о том как быстро можно сделать выборку в MySQL по большой таблице в случайном порядке не используя ORDER BY RAND(), теперь этот же вопрос всплыл на Postgre. Если вы не знаете, то ORDER BY RAND достаточно медленная операция из-за того, что сортируется фактически вся таблица. Некоторые советовали всё-таки обычную сортировку или […]

Случайная сортировка

Mysql позволяет сортировать случайным образом SELECT * FROM my_table ORDER BY RAND() Проблема в том, что такая сортировка зачастую вовсе не нужна для всей выборки — хочется просто достать случайный элемент из определённого множества, к тому же ORDER BY RAND() достаточно медленный выход из ситуации.