XML против деревьев объектов - PullRequest
2 голосов
/ 04 февраля 2011

В моем текущем проекте (сборка системы управления заказами с нуля) мы обрабатываем заказы в форме объектов XML, которые сохраняются в реляционной базе данных.

Я бы изложил требования следующим образом:

  • Выбор различных деталей в любом месте заказа
  • Обновление / обогащение данных (например, из системы CRM)
  • Ведение записи изменений (аннулирование старых данных, добавление новых значений)
  • Детали заказов должны легко выбираться запросами SQL (для поддержки 2-го уровня)

Что мы сделали:

  • Сериализация выполняется с использованием проприетарного кода, разбивая порядок на таблицы типа customer, address, phone_number, order_position и т. Д.
  • Всякий раз, когда заказ обрабатывается немного дальше (например, из-за входящего события), он полностью считывается из базы данных и собирается обратно в документ XML.
  • Выбор данных осуществляется с помощью XPath (разбросано по коду).
  • Большинство обновлений выполняется непосредственно в базе данных (после этого заказ будет перезагружен для следующего шага).

Проблемы, с которыми мы сталкиваемся:

  • Структура заказа (XSD) развивается с каждым выпуском. Поэтому XPath и пользовательское постоянство часто ломаются и выдают ошибки.
  • В итоге мы получили смесь работы с документом и базой данных (поскольку слой постоянства не может сохранить изменения в документе).

Производительность на самом деле не является проблемой (пока), поскольку это автономная система, и заказы часто намеренно задерживаются на несколько дней.

Я не ожидаю бесплатной консультации здесь, но я немного запутался в том, как можно улучшить подход (в следующий раз, в основном).

Что, по вашему мнению, является хорошим решением для удовлетворения этих требований? Будет ли лучше работать с графом объектов, чем-то вроде JXPath, OGNL и OR mapper? Или используя поддержку XML, например, база данных Oracle?

Ответы [ 2 ]

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

Если ваша схема часто меняется, я бы не советовал использовать какой-либо объект-мэппинг. Вы бы продолжали менять шаблонный код только ради этого.

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

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

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

Стандартный подход Java EE заключается в представлении ваших данных в виде POJO и использовании JPA для доступа к базе данных и JAXB для преобразования объектов в / из XML.

JPA

  • Стандарт объекта-отношения
  • Поддерживается всеми поставщиками серверов приложений.
  • Несколько доступных реализаций EclipseLink , Hibernate и т. Д.
  • Мощный язык запросов JPQL (очень похожий на SQL)
  • Обрабатывает для вас оптимизацию запросов.

JAXB

  • Стандарт объекта в XML
  • Поддерживается всеми поставщиками серверов приложений.
  • Доступно несколько реализаций: EclipseLink MOXy , Metro, Apache JaxMe и т. Д.

Пример

...