Я пишу веб-приложение на основе PHP, которое использует PDO для подключения к нескольким серверам баз данных. В настоящее время это MySQL 5.1+, SQLite 3.6+ и PostgreSQL 8/9. Другие системы могут быть добавлены позже, если они достаточно хорошо понимают мои запросы SQL или запросы могут быть преобразованы моим уровнем абстракции.
Теперь я хотел бы сохранить данные журнала в базе данных в формате XML, поскольку структура этих событий журнала сильно зависит от типа события. Я не хотел бы добавлять отдельный столбец для любой возможной информации журнала, когда большинство столбцов в большинстве случаев пустые.
Но как мне позже получить данные из базы данных? Мне нужен последовательный способ извлечения данных из документов XML в запросе SELECT. Я знаю функцию MySQL ExtractValue (), и я мог бы как-то добавить UDF (пользовательскую функцию) в SQLite через PDO. Но я не нашел ничего подобного для PostgreSQL. И потом я не знаю, каким способом лучше всего получить поддержку XML во всех СУБД для использования с одним и тем же запросом SQL. У кого-нибудь уже есть решение или лучшие практики для этого?
Обновление: Вот пример такой записи в журнале:
Num | Time | EventId | UserId | Data
1 | 2011-02-... | 1 | 42 | <data><messageid>123</messageid></data>
2 | 2011-02-... | 2 | 43 | <data><messageid>123</messageid></data>
3 | 2011-02-... | 23 | 7 | <data><oldname>006</oldname><newname>007</newname></data>
Где EventId описывает событие, которое произошло, например блокировку или разблокировку сообщения или переименование пользователя. Возможно, я бы хотел запросить / data / messageid (вместе с соответствующими EventIds, которые устанавливают это значение XML), чтобы найти все события, которые сообщают о конкретном сообщении, о котором я хочу построить историю модерации.
Это не большие XML-документы, такие как целые веб-страницы, просто хороший структурированный способ сохранить все те значения, для которых у меня нет выделенного столбца таблицы. И это расширяемо, поэтому, если я представлю новый номер EventId, я могу сохранить любой кусок данных с этим событием. Ни в коем случае условие для значения XML не должно быть единственным условием моих запросов. Строки должны быть сначала сужены (в основном) по другим критериям, например по временному интервалу или списку идентификаторов событий.