Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

XML в MySQL

Почему-то мало кто слышал, что в MySQL с версии 5.1.5 появился «чудесный» способ нарушать 1NF, при этом работая с частями поля таблицы, как со сложной структурой.

Кавычки вокруг слова «чудесный» какбэ намекают, что я не очень-то одобряю этот шаг, хотя понимаю, что иногда он оправдан. Просто я понимаю его опасность — можно увлечься этой возможность и забыть чем грозит нарушение первой нормальной формы.

Речь идёт о двух функциях — ExctractValue и UpdateXML. Если в поле таблицы хранится XML, то первая функция позволит выбрать данные при помощи XPath, а вторая — (при помощи XPath же) изменить какую-то их часть. Ничего неожиданного — функции могут работать как с полями таблицы, так и со строкой, переменной, результатом функции или любой комбинацией вышеперечисленного.

Примерно так:

SELECT ExtractValue('<a>c</a><b/>', '//a');

SELECT UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>');

SELECT * FROM users WHERE ExtractValue(info, '//firstname') == 'Иван' AND ExtractValue(info, '//surname') == 'Сагалаев';

В случае, если XPath не дал результата или в поле оказался не XML, функции вернут NULL (версии MySQL до 5.1.12 содержат баг и частично могут работать даже с not-well-formed XML).

6 комментариев
astur (astur.net.ru) 2009

Ещё немного фантазии, и можно сделать документо-ориентированную ДБ на основе MySQL.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для astur.net.ru:

Не-не, лучше что-то специализированное. Они и версии хранят нативно и шардятся лучше.

astur (astur.net.ru) 2009

Комментарий для Евгения Степанищева:

Понятно, что лучше, но сама идея... :)

jankkhvej (jankkhvej.blogspot.com) 2009

http://trends.google.com/trends?q=DB2%2BXML%2C%2BMySQL%2BXML%26date=all%26geo=all%26ctab=180663936%26sa=N

(там, к сожалению, данных ранее 2004 года нет, это несколько сглаживает драму)

То есть именно в тот момент, когда этот XML в реляционных БД уже всем успел надоесть, MySQL занимается изобретением велосипеда.
И так у них во всём. Жалко тех, что сейчас делает что-то с MySQL. И приятно наблюдать естественный отбор в действии.

Евгений Степанищев (bolknote.ru) 2009

Комментарий для jankkhvej.blogspot.com:

А мне не жалко :) Если так рассуждать, то мне жалко, например, тех, кто делает partitions в PostrgeSQL, везде свои недостатки.

jankkhvej (jankkhvej.blogspot.com) 2009

Ну в конкретном случае с MySQL и его продажей надо мигрировать, пока ещё можно.