Scientific journal
Научное обозрение. Педагогические науки
ISSN 2500-3402
ПИ №ФС77-57475

FEATURES OF IMAGE STORAGE IN RELATIONAL DBMS

Odinokov D.A. 1 Artyushina E.A. 1
1 Penza State Technological University
1861 KB
At the moment, a large number of existing software applications in the course of their operation use databases for organized storage of information, as well as its reading, recording or processing. One of the most popular tasks in the management of data – operations with binary large objects (BLOB), which are usually bitmaps, audio or other multimedia object. Database support for blobs is not always universal. The purpose of the research work of the student is the development of image storage technologies in relational DBMS. The tasks solved in the course of the study include: the study of the features of image storage in traditional OLTP-systems with different architectures; the choice of tools for database development; the design of a logical data model in the selected format; the creation of a test application for storing images in the integrated environment MS Visual Studio 2017 (C#). Established relational models are changing to keep pace. In this article are considered practical tools for navigating this shifting product landscape and finding candidate systems that best fit a data managers applications needs.
architecture for transaction processing
image storage
relational database management system

Целью научно-исследовательской работы является освоение технологий хранения изображений в реляционных СУБД. К задачам, решенным в ходе исследования, относятся: 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.

odinok-1.tif

Рис. 1. Диаграмма БД «Туристическое агентство»

Популярная ныне СУБД SQLite со встраиваемой архитектурой не рассчитана на коллективное использование в сети и может поставляться как составная часть IDE, например, Android Studio. Наиболее часто СУБД SQLite используется в мобильных приложениях для локального хранения данных клиента, в том числе – изображений различных форматов. Для этого служат поля специфического типа BLOB (Binary Large Object).

odinok-2.tif odinok-3.tif

Рис. 2. Конструктор таблицы Test в администраторе DB Browser for SQLite

Как видно из рис. 2, среда администрирования DB browser for SQLite имеет универсальные встроенные средства для просмотра двоичных объектов BLOB. Однако при проектировании любого, даже элементарного Android-приложения для работы с БД программисту придется самостоятельно обеспечивать доступ к изображениям, хранящимся в локальной базе. Это возможно сделать с помощью метода execSQL, который поддерживает выполнение обычных SQL-запросов на манипулирование данными, либо используя стандартные библиотеки, к примеру – метод getBlob класса Cursor.

В клиент-серверной реляционной СУБД Microsoft SQL Server также имеются различные возможности для сохранения изображений. Можно хранить фотографии непосредственно в базе, используя для этого подходящий системный тип (например, image). Или же можно хранить в БД лишь ссылки на изображения (filestream), которые, в свою очередь, будут располагаться в заданных каталогах файловой системы компьютера-сервера.

odinok-6.tif

Рис. 3. Конструктор тестовой таблицы report

odinok-5.tif

Рис. 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.

odinok-4.tif

Рис. 5. Загрузка изображения в БД MS SQL Server

Помещаем вызов метода PutImageBinaryInDb в тело главного метода Main, запускаем тестовое приложение на C# и в результате его выполнения получаем новую запись в таблице report, представленную на рис. 6.

Для обратного процесса получения изображения из базы данных будем использовать метод GetImageBinaryFromDb (рис. 7).

odinok-9.tif

Рис. 6. Результат загрузки бинарного кода изображения в таблицу report

odinok-7.tif

Рис. 7. Получение из БД строки с изображением и его форматом

В приведенном выше фрагменте кода подключаемся к базе данных и создаем запрос на выборку SELECT, возвращающий из таблицы report запись со значением уникального поля id = 1. Полученный из БД двоичный код помещаем в целочисленный массив для последующей обработки.

Далее конвертируем бинарный код обратно в изображение и сохраняем файл на диск, программный код приведен на рис. 8.

odinok-8.tif

Рис. 8. Конвертация и сохранение изображения на диск

odinok-10.tif

Рис. 9. Файл с изображением, полученным из БД

При вызове метода GetImageBinaryFromDb из точки входа Main тестовой программы, изображение успешно сохраняется в заданном каталоге images на локальном диске D:\ в файле result_new.jpg, как это показано ниже на рис. 9.

Таким образом, на основе вышеизложенного материала можно сделать вывод, что для хранения графической информации в данной работе вполне может быть использован тип image, входящий в набор системных типов реляционной клиент-серверной СУБД Microsoft SQL Server 2008 R2 Express Edition при условии соблюдения ограничений на средний объем изображений до 1 Мб.