Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
ВНИМАНИЕ! Никогда не пытайтесь выполнить то же для любой базы данных, которая не является "пустой" - т. е. содержит определенные пользователем объекты.
. ! .
Теперь мы переходим к типам данных, которые Firebird реализует посредством больших двоичных объектов (BLOB), включая текст, нетипизированные двоичные и пользовательские форматы и специализированные реализации BLOB, которые Firebird представляет как типы ARRAY.
ГЛАВА 12. BLOB и массивы.
Типы BLOB (Binary Large Objects, большие двоичные объекты) являются сложными структурами, используемыми
Firebird использует структуры BLOB для различных внутренних целей. Он также предоставляет две главные категории для пользовательских типов, применяющие этот вид структуры хранения: BLOB и массивы (ARRAY). типы ARRAY могут быть использованы для представления однородных массивов большинства типов данных.
Типы BLOB
Почти любой вид сохраняемых данных может храниться в BLOB: графические картинки, векторные рисунки, звуковые файлы, видео, документы размером с главу или целую книгу, любой вид мультимедийной информации. Поскольку BLOB может содержать различные виды информации, он требует специальной обработки чтения и записи на клиенте.
Типы BLOB могут, когда это возможно [28] , хранить содержимое файлов, сгенерированных другими приложениями, такими как текстовые процессоры, программное обеспечение CAD или редакторы XML. Преимущества могут быть в управлении транзакциями для динамических данных, защите от внешнего интерфейса, управлении версиями и возможности доступа к внешне созданным данным с помощью средств операторов SQL.
Столбцы BLOB не могут быть проиндексированны.
28
Тип BLOB не является волшебной палочкой для сохранения и поиска больших объемов файлов двоичных данных. Иногда при учете производительности накладные расходы и неуправляемость хранения нединамических объектов данных, вроде фильмов или звуков, в базе данных перевешивает преимущества, которые вы предполагали. Хранение ссылок на объекты файловой системы может быть хорошим решением.
Поддерживаемые типы BLOB
Firebird имеет два предварительно определенных типа BLOB, отличающиеся атрибутом подтипа (ключевое слово в SQL SUB_TYPE), как описано в табл. 12.1.
Таблица 12.1. Предварительно определенные подтипы BLOB
Определение | Алиас SQL | Назначение |
BLOB SUB_TYPE 0 | Не используется | Общий тип BLOB данных любого вида, включая текст. Общее название: "нетипизированный двоичный BLOB", однако Firebird ничего не знает о его содержании |
BLOB SUB_TYPE 1 | BLOB SUB_TYPE TEXT | Более специализированный подтип для хранения полного текста. Эквивалентен типам CLOB и MEMO, реализованных в некоторых других СУБД. Рекомендуется использовать с интерфейсами приложений, таких как компоненты RAD или поисковые машины, которые выполняют специальную трактовку для каждого типа |
Подтип BLOB является положительным или отрицательным целым, которое указывает природу данных, содержащихся в столбце. Помимо двух предопределенных типов для общего использования Firebird имеет множество подтипов, которые он применяет для внутренних целей. Все эти внутренние подтипы имеют положительные номера.
Пользовательские подтипы могут быть добавлены с отличающимися идентификаторами особых типов для объектов данных, таких как HTML, XML или текстовый процессор, картинки JPEG или PNG и т.д.
– именно вам делать выбор. Отрицательные номера подтипов (от-1 до -32 768) резервируются для пользовательских подтипов.
Система подтипов BLOB также позволяет выполнять специфические преобразования одного подтипа в другой. Firebird осуществляет поддержку автоматического преобразования между парой подтипов BLOB в форме BLOB-фильтров. Фильтры BLOB являются специальным видом внешних функций с единственным назначением: получение объекта BLOB одного формата и преобразование его в объект BLOB другого формата. Возможно создание BLOB-фильтра для преобразования между пользовательским (отрицательным) и предварительно определенным подтипами - обычно TEXT.
Объектный код для BLOB-фильтров размещается в библиотеках коллективного доступа. Фильтр, вызываемый при необходимости динамически, распознается на уровне базы данных (не сервера) при его объявлении в метаданных:
DECLARE FILTER <имя-фильтра>
INPUT_TYPE <подтип> /* идентифицирует тип преобразуемого объекта */
OTPUT_TYPE <подтип> /* идентифицирует тип создаваемого объекта */
ENTRY_POINT '<имя-точки-входа>' /* имя экспортируемой функции */
MODULE_NAME '<имя-внешней-библиотеки>';
/* имя библиотеки BLOB-фильтра */
! ! !
ПРИМЕЧАНИЕ. Написание и использование BLOB-фильтров выходит за пределы тем настоящего руководства. Информацию по этой теме можно найти в базах знаний Firebird.
. ! .
Firebird не проверяет тип или формат данных BLOB. При планировании их хранения вы должны создать такой код вашего приложения, чтобы формат данных был согласован с их подтипом, неважно предварительно определенным или пользовательским.
Сегменты BLOB
Данные BLOB хранятся в различных форматах в обычном столбце данных и вне столбца. Они хранятся в виде сегментов на одной или более страницах базы данных. Сегменты являются дискретными фрагментами неформатированных данных, которые обычно создаются приложением в виде потока и передаются функциям API для пакетирования и передачи по сети по одному блоку за раз непрерывно.
В структуре записи ссылка на данные BLOB осуществляется с помощью идентификатора BLOB (BLOB_ID). BLOB_ID является уникальной шестнадцатеричной парой, которая обеспечивает перекрестные ссылки между данными BLOB и содержащей их таблицей. При поступлении на сервер сегменты сохраняются в базе в том же порядке, как они были получены, хотя не обязательно с теми же размерами фрагментов, с которыми они передавались.
Когда это возможно, BLOB сохраняются на той же странице, что и запись с остальными данными. При этом большие BLOB могут занимать много страниц, а их начальные страницы могут содержать не данные, а массив указателей на страницы с содержимым BLOB.
Следующий оператор определяет два столбца BLOB: BLOB1 подтипа 0 (по умолчанию) и BLOB2 подтипа 1 (TEXT, с набором символов по умолчанию):
CREATE TABLE TABLE2
(BLOB1 BLOB, /* SUB_TYPE 0 */