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).
Ещё немного фантазии, и можно сделать документо-ориентированную ДБ на основе MySQL.
Комментарий для astur.net.ru:
Не-не, лучше что-то специализированное. Они и версии хранят нативно и шардятся лучше.
Комментарий для Евгения Степанищева:
Понятно, что лучше, но сама идея... :)
http://trends.google.com/trends?q=DB2%2BXML%2C%2BMySQL%2BXML%26date=all%26geo=all%26ctab=180663936%26sa=N
(там, к сожалению, данных ранее 2004 года нет, это несколько сглаживает драму)
То есть именно в тот момент, когда этот XML в реляционных БД уже всем успел надоесть, MySQL занимается изобретением велосипеда.
И так у них во всём. Жалко тех, что сейчас делает что-то с MySQL. И приятно наблюдать естественный отбор в действии.
Комментарий для jankkhvej.blogspot.com:
А мне не жалко :) Если так рассуждать, то мне жалко, например, тех, кто делает partitions в PostrgeSQL, везде свои недостатки.
Ну в конкретном случае с MySQL и его продажей надо мигрировать, пока ещё можно.