Глава 12. Объектно-реляционные типовые решения... 293
простую сериализацию содержимого буфера и последующее сохранение этого буфера в
соответствующем поле таблицы.
Преимуществами объектов BLOB являются простота кодирования (если они поддер-
живаются средой разработки) и небольшие размеры занимаемого пространства. Недос-
татки же заключаются в том, что для применения объектов BLOB используемая СУБД
должна поддерживать двоичный формат данных и что структуру графа нельзя воссоздать
без самого объекта, а потому содержимое этого поля совершенно непригодно для про-
смотра человеком. Впрочем, наиболее серьезная проблема использования объектов
BLOB связана с версиями, например если вы измените класс отдела, то не сможете про-
читать его предыдущие сериализации. Эта проблема не так уж незначительна, как может
показаться на первый взгляд, поскольку содержимое базы данных способно храниться на
протяжении долгого времени.
Альтернативой BLOB являются уже упоминавшиеся объекты CLOB. В этом случае
граф объектов сериализуется в текстовую строку, содержащую всю необходимую инфор-
мацию. Полученный текст вполне читабелен, что заметно облегчает работу при простом
просмотре базы данных. Тем не менее сериализованный объект в текстовом формате за-
нимает гораздо больший объем памяти и может потребовать написания специального
анализатора. Кроме того, обработка символьных объектов обычно занимает больше вре-
мени, чем обработка двоичных.
Большую часть недостатков объектов CLOB можно преодолеть путем сериализации
в формат XML Анализаторы XML доступны всем, поэтому писать собственный анализатор
вам не придется. Кроме того, в последние годы XML превратился в общепринятый стан-
дарт и для работы с этим форматом данных постоянно появляется все больше и больше
программных средств. К сожалению, использование XML не решает проблемы с занимае-
мым пространством. Вообще говоря, оно ее только усложняет, поскольку описания объек-
тов на языке XML слишком "многословны". Данную проблему можно решить путем ис-
пользования сжатого формата XML в качестве объекта BLOB; разумеется, это лишит его
читабельности, однако значительно сократит используемое дисковое пространство.
При использовании крупного сериализованного объекта следует обращать особое вни-
мание на проблемы идентификации. Предположим, вы хотите, чтобы в записи о заказе
содержались сведения о покупателе. Не помещайте LOB с данными покупателя в таблицу
заказов — в этом случае данные будут скопированы в каждый заказ, что значительно за-
труднит обновление одного из них. (Тем не менее этот подход может оказаться весьма
удобным, если вы хотите сохранить данные о покупателе в том состоянии, в котором они
находились в момент размещения заказа; это избавит от необходимости создавать вре-
менные отношения.) Если вы хотите, чтобы обновление данных о покупателе выполня-
лось при обновлении каждого заказа в классическом реляционном понимании этого
процесса, LOB следует поместить в таблицу покупателей, чтобы на него могли ссылаться
сразу несколько заказов. Не беспокойтесь, если полученная таблица будет состоять всего
из двух полей — идентификатора и LOB; это вполне нормально.
Следует также отметить, что для данного типового решения характерно дублирование
данных. Зачастую дублированию подвергается не весь объект, а только его часть, которая
перекрывается с другой частью. Чтобы избежать подобных проблем, необходимо тща-
тельно следить за тем, какие данные помещаются в крупный сериализованный объект,
и гарантировать, чтобы эти данные были доступны только объекту, который выступает
в роли владельца крупного сериализованного объекта.