Введение 4
1. Постановка задачи 6
2. Обзор 7
2.1. Стандартные средства PostgreSQL 7
2.2. Система контроля версий Git 8
2.3. Прочие подходы 9
3. Предлагаемое решение 13
3.1. Описание решения 13
3.2. Выбор файловой системы 14
4. Реализация 16
4.1. Архитектура библиотеки 16
4.2. Детали реализации 17
4.3. Разграничение адресного пространства 18
4.4. Многопроцессное взаимодействие 20
4.5. Изолированные транзакции 22
5. Функциональное тестирование 23
Заключение 24
Введение 4
1. Постановка задачи 6
2. Обзор 7
2.1. Стандартные средства PostgreSQL 7
2.2. Система контроля версий Git 8
2.3. Прочие подходы 9
3. Предлагаемое решение 13
3.1. Описание решения 13
3.2. Выбор файловой системы 14
4. Реализация 16
4.1. Архитектура библиотеки 16
4.2. Детали реализации 17
4.3. Разграничение адресного пространства 18
4.4. Многопроцессное взаимодействие 20
4.5. Изолированные транзакции 22
5. Функциональное тестирование 23
Заключение 24
Список литературы 25
Сегодня сложно представить себе организацию, работа которой обходится без информационных систем. Одной из основных составляющих любой информационной системы являются данные. Для их хранения и управления используются различные технологии, например, разнообразные файловые хранилища и в частном случае базы данных. Для настраивания и администрирования баз данных применяется набор программных средств, называемый системой управления базами данных (СУБД).
Одной из самых популярных объектно-реляционных СУБД является PostgreSQL, которая широко используется в различных областях, включая финансы, науку и образование. Она имеет открытый исходный код, поддерживает репликации, хранимые процедуры и прочие полезные функции, а также совместима с набором требований ACID. Одним из требований ACID является атомарность, которая гарантирует, что транзакция либо будет выполнена полностью, либо не выполняется совсем. Также крайне важно сохранять согласованность данных в базе, особенно при одновременной работе над ней несколькими пользователями, что критично для многих информационных систем, например, для банковских или систем, взаимодействующих с рынком ценных бумаг.
Для хранения данных внутри базы в PostgreSQL предусмотрено множество типов, таких как integer, text, boolean и прочие. Эти типы данных позволяют эффективно хранить и обрабатывать структурированные данные, однако они не подходят для неструктурированных данных, например, бинарных. Основное отличие этих типов данных в том, что неструктурированные данные не соответствуют заранее определенной структуре, из-за этого подходы к хранению и обработке такого рода информации должны отличаться от соответствующих подходов работы со структурированными данными. Примерами бинарных данных, которые может быть полезно хранить в информационной системе, могут быть pdf-документы, картинки, архивы, электронные письма, медицинские данные и тп. Несмотря на то, что перечисленные данные имеют строго определенную внутреннюю структуру, с точки зрения базы данных — это набор байт заданной длины.
Если бинарные данные имеют небольшой размер, то часто для их хранения помимо основной таблицы заводят вспомогательную, в которой хранят мета-информацию, такую как дата последнего изменения и ссылка на конкретную версию файла. Такой способ подходит, если планируется хранить файлы небольшого размера, которые помещаются в страницу фиксированного размера (в PostgreSQL обычно 8 Кб). Однако хранение файлов большого размера, размещение которых требует десятки и более блоков, начинает занимать значительное время. В результате пользователи сталкиваются с проблемами производительности.
В данной работе будут рассмотрены подходы к транзакционному доступу к бинарным файлам внутри СУБД PostgreSQL, предложен подход, позволяющий делать это эффективно с точки зрения занимаемого дискового пространства и времени, а также поддерживающий транзакционность операций над бинарными данными.
В результате выполнения выпускной квалификационной работы были решены следующие задачи:
• Проанализированы существующие подходы к решению задачи хранения бинарных данных в PostgreSQL.
• Определён подход к хранению бинарных данных.
• Реализована библиотека, предоставляющая API для транзакционного доступа к бинарным данным в PostgreSQL.
• Проведено тестирование полученного решения.
Код проекта закрыт и принадлежит компании ООО “Датаджайл”.