Целью научно-исследовательской работы является освоение технологий хранения изображений в реляционных СУБД. К задачам, решенным в ходе исследования, относятся: 1) изучение особенностей хранения изображений в традиционных СУБД с различной архитектурой; 2) выбор инструментальных средств для разработки базы данных; 3) проектирование логической модели данных в выбранном формате [1]; 4) создание тестового приложения для хранения изображений в IDE MS Visual Studio 2017 (язык C#).
Логическая структура БД туристического агентства представлена на рис. 1.
Реляционные СУБД разнообразной архитектуры предусматривают множество вариантов хранения графической информации. Так, например, в таблицах файл-серверной СУБД Microsoft Access нетекстовая информация (фото, графики и диаграммы, формулы, рисунки и пр.) содержится в полях-контейнерах OLE.
Поле объекта OLE (Object Linking and Embedding) является средством, позволяющим установить связь с объектами другого приложения или внедрить нетекстовый объект в базу данных. В соответствии с этой технологией внедренным или связанным OLE-объектом является документ или его фрагмент, созданный с помощью другого приложения, поддерживающий формат документа-источника, а также информацию об OLE-сервере. Внедренный OLE- объект может сохраняться непосредственно в файле базы данных. Для обработки подобных полей в SQL-клиенте, который спроектирован, например, с помощью IDE Embarcadero Delphi, можно использовать компонент OleContainer. Он принимает объект OLE, который загружается из графического файла стандартным методом CreateObjectFromFile. Используя этот контейнер, можно отобразить в клиентском приложении любую фотографию, которая хранится в базе данных в поле OLE.
Рис. 1. Диаграмма БД «Туристическое агентство»
Популярная ныне СУБД SQLite со встраиваемой архитектурой не рассчитана на коллективное использование в сети и может поставляться как составная часть IDE, например, Android Studio. Наиболее часто СУБД SQLite используется в мобильных приложениях для локального хранения данных клиента, в том числе – изображений различных форматов. Для этого служат поля специфического типа BLOB (Binary Large Object).
Рис. 2. Конструктор таблицы Test в администраторе DB Browser for SQLite
Как видно из рис. 2, среда администрирования DB browser for SQLite имеет универсальные встроенные средства для просмотра двоичных объектов BLOB. Однако при проектировании любого, даже элементарного Android-приложения для работы с БД программисту придется самостоятельно обеспечивать доступ к изображениям, хранящимся в локальной базе. Это возможно сделать с помощью метода execSQL, который поддерживает выполнение обычных SQL-запросов на манипулирование данными, либо используя стандартные библиотеки, к примеру – метод getBlob класса Cursor.
В клиент-серверной реляционной СУБД Microsoft SQL Server также имеются различные возможности для сохранения изображений. Можно хранить фотографии непосредственно в базе, используя для этого подходящий системный тип (например, image). Или же можно хранить в БД лишь ссылки на изображения (filestream), которые, в свою очередь, будут располагаться в заданных каталогах файловой системы компьютера-сервера.
Рис. 3. Конструктор тестовой таблицы report
Рис. 4. Конвертация файла изображения в бинарный код
В настоящем исследовании было принято решение выбрать для разработки первый вариант, так как использовать тип filestream рекомендуется при среднем объеме файлов свыше 1 Мб, а в нашем случае изображения приемлемого качества имеют средний объём ≈100 Кб [2]. Изображения будут храниться в бинарном коде в ячейках таблицы с типом image. Для апробации предлагаемого способа обработки изображений в СУБД MS SQL Server 2008 R2 Express Edition была создана тестовая таблица report [3, 4].
Конструктор таблицы представлен ниже на рис. 3.
Чтобы обеспечить загрузку в базу данных изображений, например, с локального диска компьютера и, наоборот, получить это изображение из базы, использована интегрированная среда разработки программ Microsoft Visual Studio 2017. Для этого на объектно-ориентированном языке C# [5] было реализовано два метода, для загрузки и получения изображений из БД, соответственно.
Так, в методе PutImageBinaryInDb, который используется для записи изображения в БД, содержатся операторы для преобразования исходного изображения в бинарный код и получения расширения файла. Расширение необходимо, чтобы в дальнейшем можно было бы работать с изображениями разных форматов. Код метода представлен ниже на рис. 4.
Далее в этом же методе связываемся с локальной базой данных и записываем изображение в текущую строку таблицы report, соответствующий фрагмент кода представлен далее на рис. 5.
Рис. 5. Загрузка изображения в БД MS SQL Server
Помещаем вызов метода PutImageBinaryInDb в тело главного метода Main, запускаем тестовое приложение на C# и в результате его выполнения получаем новую запись в таблице report, представленную на рис. 6.
Для обратного процесса получения изображения из базы данных будем использовать метод GetImageBinaryFromDb (рис. 7).
Рис. 6. Результат загрузки бинарного кода изображения в таблицу report
Рис. 7. Получение из БД строки с изображением и его форматом
В приведенном выше фрагменте кода подключаемся к базе данных и создаем запрос на выборку SELECT, возвращающий из таблицы report запись со значением уникального поля id = 1. Полученный из БД двоичный код помещаем в целочисленный массив для последующей обработки.
Далее конвертируем бинарный код обратно в изображение и сохраняем файл на диск, программный код приведен на рис. 8.
Рис. 8. Конвертация и сохранение изображения на диск
Рис. 9. Файл с изображением, полученным из БД
При вызове метода GetImageBinaryFromDb из точки входа Main тестовой программы, изображение успешно сохраняется в заданном каталоге images на локальном диске D:\ в файле result_new.jpg, как это показано ниже на рис. 9.
Таким образом, на основе вышеизложенного материала можно сделать вывод, что для хранения графической информации в данной работе вполне может быть использован тип image, входящий в набор системных типов реляционной клиент-серверной СУБД Microsoft SQL Server 2008 R2 Express Edition при условии соблюдения ограничений на средний объем изображений до 1 Мб.