Лучший способ извлечь данные XML в разных СУБД? - PullRequest
1 голос
/ 10 февраля 2011

Я пишу веб-приложение на основе 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 не должно быть единственным условием моих запросов. Строки должны быть сначала сужены (в основном) по другим критериям, например по временному интервалу или списку идентификаторов событий.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Я бы держался подальше от БД, обеспечивающей функциональность XML, и сохранял бы любой XML как BLOB.Это может означать, что вам придется дублировать некоторые данные;в основном все, что вы хотите запросить.Если вы хотите, чтобы все это было запрашиваемым, вам лучше воспользоваться собственной базой данных XML.

Причина, по которой расширения XML часто кажутся очевидными, заключается в том, что даже если сервер анализирует XML, ему все равно нужно отправлять его черезпровод;быть декодирован или проанализирован снова.Поэтому часто лучше просто передать его как последовательность байтов и обработать синтаксический анализ на стороне клиента.Единственное исключение будет, если вы захотите использовать методы доступа на основе XML (поиск xpath или xquery);но именно здесь родные базы данных XML гораздо лучше подходят, чем реляционные БД («помада на свинье»).

Наконец, вместо объединения XML и реляционной БД, более распространенной двойной настройкой является объединение базы данных с поискомсистема индексов (например, Lucene, Elastic Search);это дает вам мощный бесплатный текстовый поиск вместе с хранилищем.Индекс поиска затем постепенно обновляется при изменении данных в базе данных.

1 голос
/ 11 февраля 2011

Если вы стремитесь к независимости базы данных, хранение XML в вашей базе данных будет довольно обременительным для вашего уровня абстракции, поскольку, к сожалению, каждая СУБД обрабатывает его по-своему. Это не значит, что это невозможно, но вам придется проделать большую работу, исследуя возможности XML (или их отсутствие) в каждой из ваших поддерживаемых баз данных. (И я не думаю, что SQLite вообще имеет какие-либо функции XML ...)

Если вам абсолютно необходимо использовать XML, XQuery в значительной степени является идеальным методом для запроса необработанного XML, но он не поддерживается реляционными базами данных. SQL / XML является одним из стандартов для запросов XML в них, но он не получил широкого применения.

В противном случае, нет ничего страшного в том, что в таблице много пустых значений. Предположительно, вашему коду приложения все равно придется проверять наличие нулевых значений, независимо от того, приходят ли они из таблицы базы данных или из несуществующего элемента XML ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...