1. Введение
Бумага на протяжении многих лет являлась самым распространенным материалом для письма. Без ее изобретения и широкого внедрения не были бы возможны распространение книгопечатания и, как следствие, связанная с этим информационная революция, перевернувшая сознание человечества. Этот факт делает бумагу не просто носителем текста, но важнейшей составной частью развития письменной и печатной культуры. От ее свойств, технологических особенностей, требований к условиям производства, его объемов зависело развитие центров книгопечатания и образования, цивилизации в целом. В производстве бумаги было занято значительное количество людей, оно было стимулом для технологического развития, так как требовало механизации для увеличения выхода продукта. Все это делает изучение технологии бумаги самоценной и самодостаточной тематикой исследования.
Роль бумаги в построении цивилизации и сохранении памяти и необходимость ее изучения были давно осознаны учеными различных специализаций [1], [2]. Первоначально исследование бумаги связывалось с задачами датировки рукописей по филиграням. Не менее важным было изучение бумаги в процессе предреставрационных исследований и работ, направленных на выработку мер по стабилизации и превентивной консервации документов на бумажных носителях. В настоящий момент все больше прикладное значение исследований сменяется пониманием необходимости изучения бумаги как многогранного комплекса, в котором пересекаются самые разные задачи и представители разных дисциплин. Бумага становится точкой пересечения материаловедения, производства, торговли, книжной культуры и моды. В результате такой подход порождает большое количество информации, которое необходимо хранить, структурировать, обрабатывать, делать доступным максимально широкому научному сообществу. Задача создания базы данных по бумаге ставилась несколько ранее [3], но в настоящий момент в открытом доступе существуют лишь базы данных по филиграням [2]. Разумеется, филигрань — важнейший атрибут бумаги, несущий в себе значительное количество информации. Однако она ни в коем случае не исчерпывает всей полноты материальности бумаги. Таким образом, на сегодняшний день желательно создание базы данных, которая рассматривала бы не отдельные аспекты бумаги как материала, а позволяла бы сконцентрировать максимальное количество информации с целью ее последующей обработки и анализа.
2. Методы и программное обеспечение
Основное назначение современных баз данных — удобное, структурированное и понятное хранение больших объемов информации на компьютере [4].
Работа с базами данных на компьютерах осуществляется с помощью специальных систем управления базами данных (СУБД), которые связывают сами данные с приложением или программным обеспечением (рис. 1).
СУБД выполняет две основные функции:
- предоставляет доступ к базе данных для оператора или программного обеспечения;
- через СУБД происходят управление и обработка данных базы.
В качестве СУБД в данном проекте была выбрана свободная PostgreSQL, версия 15.0 и программный продукт PgAdmin 4 для администрирования и разработки базы данных. PostgreSQL — объектно-реляционная система управления базами данных, которая работает на языке SQL, поддерживает широкие возможности и обладает высокой производительностью [5]. Некоторые из множества преимуществ PostgreSQL, которые послужили толчком для выбора именно этой СУБД это:
- в первую очередь, открытый исходный код PostgreSQL. Т. е. СУБД находится в открытом доступе, любой пользователь может скачать и начать работу с базами данных;
- PostgresSQL работает с различными форматами данных, как обычными числовыми и текстовыми, так и с форматами файлов, картинок, JSON файлами и даже геометрическими данными координат геопозиций;
- PostgreSQL — надежная СУБД и соответствует требованиями ACID (атомарность от англ. atomicity, согласованность от англ. consistency, изолированность от англ. isolation, устойчивость от англ. durability). В такой СУБД данные хранятся надежно и не теряются в процессе выполнения запросов в реальном времени;
- в PostgreSQL возможно работать с данными больших размеров, а размер базы данных и вовсе не ограничен;
- легкая расширяемость и управление PostgreSQL.
Обычные пользователи обращаются к БД не через СУБД, а через приложение, например, сайт. Основной задачей в данном проекте было создание базы данных, удобной для использования любым пользователям, как физикам, химикам, так и историкам, реставраторам, хранителям. Для этого требуется создать приложение, которое будет предоставлять доступ к базе данных и содержать весь необходимый функционал.
Для разработки веб-приложения и сайта базы данных лаборатории был выбран фреймворк Django, который работает на языке Python. Версия Django в данном проекте 3.2.7, а также использовалось большое количество различных дополнительных библиотек и модулей python и Django, такие как numpy, matplotlib, psycopg2 и многие другие [6]. Можно выделить несколько причин выбора именно Django среди остальных фреймворков:
- наличие открытого исходного кода, т. е. все находится в открытом пользовании и пользование фреймворком доступно каждому;
- наличие бесплатной поддержки и большой, доступной документации;
- удобство в использовании;
- безопасность создаваемого приложения;
- умеренная гибкость кода, т. е. Django позволяет разработчику создавать индивидуальные гибкие проекты, но в то же время не даст совершить ошибку на корневом уровне (например, чтобы база данных работала только на определенных операционных системах);
- кроссплатформенный фреймворк;
- система «всё включено». В Django реализуются как frontend (интерфейс и взаимодействие с пользователем), так и backend (внутренняя часть продукта на сервере) разработка, благодаря чему появляется возможность создавать и управлять сайтом и базой данных в одном месте, что значительно упрощает работу разработчика.
Основная задача фреймворка — соединить в себе подключение к базе данных, модели и маршруты сайта, сам сайт. Для этого структура фреймворка включает в себя различные компоненты, такие как URL-маршрутизаторы, которые передают запрос пользователя с сайта в представления фреймворка (views), сами представления, которые обрабатывают запрос и обращаются с ним к базе данных, модель (ORM — Object Relational Mapping), предоставляющую нужную информацию и передающую ее в представления и HTML-шаблоны, которые визуализируют и предоставляют пользователю запрошенную информацию. Примерная схема работы фреймворка представлена на рис. 2 [6].
Подробнее все этапы работы с приложением и базой данных описаны в следующей части.
3. Основная часть
3.1. Проектирование базы данных
На первом этапе происходит проектирование базы данных, т. е. определение необходимых отношений (таблиц), характеристик объектов, типов полей и связей между ними [7]. В приложении 1 представлена таблица с данными, характеристиками объектов, которые будут храниться в базе данных лаборатории и тип поля, который требуется для ввода информации. Этот список полей разработан на основании оборудования и возможностей, имеющихся в настоящий момент в распоряжении Лаборатории комплексного исследования рукописных памятников Санкт-Петербургского института истории РАН, на базе которой осуществляется данная работа. Был учтен опыт Международной ассоциации историков бумаги [3].
Для дальнейшей работы с фреймворком (рис. 2) надо понимать, в каком формате и какие типы полей присваивать тем или иным характеристикам в PostgreSQL. Типы полей отличаются в зависимости от выбранной СУБД, но именно в PostgreSQL есть возможность работать с большим количеством данных разного формата. Так, для текста и чисел присваиваются поля varchar(n), text и integer (smallint, bigint и т. д.), а для хранения даты стандартное поле date. Картинки, файлы и фотографии хранятся в Django, а в самой базе данных хранится строка — ссылка на нужную картинку. Поля, которые представляют собой выбор из словаря, хранятся как числовой формат, т. е. пользователь выбирает определенный пункт словаря — индекс. Также для создания поля по введению количественного анализа использовано поле типа jsonb, характерное именно PostgreSQL. Jsonb хранит данные JSON (JavaScript Object Notation) в бинарном формате [6].
3.2. Создание проекта и приложения на Django
Чтобы не допустить несостыковок и неполадок в версиях Python, Django и других пакетов, разработка происходит в виртуальном окружении (venv). Благодаря виртуальному окружению можно изолировать проект от существующих данных на компьютере.
Разработка проекта происходит на сервере и на данный момент используется локальный сервер компьютера разработчика — localhost 127.0.0.1. Для запуска сервера используется команда «python manage.py runserver».
На первом этапе выполняется команда «django-admin startproject DataBase», после чего создается проект DataBase, который хранит в себе все необходимые файлы. Одним из наиболее важных файлов является settings.py, где устанавливаются основные глобальные настройки проекта. Здесь задается секретный ключ для выгрузки на общедоступный сервер, вывод ошибок, ограничение доменов для доступа к сайту или базе данных, регистрируются приложения, указывается конкретная база данных, с которой будет идти работа в проекте, и устанавливается язык проекта [10].
Для работы с разными категориями сайта в Django создаются приложения, которые содержат файлы работы с базой данных, HTML шаблоны страниц сайта и файлы для переадресации по сайту. Приложение создается с помощью команды «python manage.py startapp “название приложения”», и проект добавляется автоматически. Для связи приложения с сайтом, требуется зарегистрировать его в файле settings.py, INSTALLED_APPS.
На данный момент в проекте находится два приложения — main, которое отвечает за сайт, главную страницу, контакты, информацию, а также news, которое отвечает за работу с базой данных и ее отображение на сайте.
Для того чтобы приложение отображалось на веб-сайте и работало по нужной ссылке, в файле urls.py добавляется новая ссылка:
Теперь приложение будет подключаться при переходе по ссылке, а также Django будет ссылаться на необходимые HTML шаблоны для отображения страницы сайта.
3.3. Создание модели базы данных
Для работы с самой базой данных было создано новое приложение — news с определенным URL и отличными от приложения main HTML шаблонами. Для создания новых таблиц в базе данных (моделей) в Django используется файл models.py, где прописываются различные классы — таблицы [11]. В каждом классе прописываются поля таблицы, их типы полей, подписи и многие другие характеристики. В базе данных лаборатории на данный момент находится одна таблица — Objects. Пример формирования класса моделей и первые строчки Object представлены ниже:
После названия поля и ссылки на models указывается тип поля (PositiveSmallIntegerField, BigIntegerField, CharField, ImageField и т. д.), название поля в базе данных, параметры, необходимые под различные типы полей. Например, в поле CharField указывается максимальная длина возможного введенного текста max_length=250, в поле, где требуется выбор из словаря, указывается ссылка на словарь choices=MONTH, а сам словарь также прописывается в файле models.py.
Особый интерес представляют поля для ввода количественного анализа вещества, т. е. процентного соотношения веществ в образце. Поскольку заранее неизвестно, сколько какого вещества будет в том или ином образце, поле будет динамическим — меняться от образца к образцу. Формат ячейки для ввода JSONB — тип поля, характерный именно для PostgreSQL и по сути являющийся json, только более компактный и удобный в использовании. Поле ввода в панели администрирования представляет собой обычное поле ввода json файлов формата ключ-значение: {key: value, key: value, key: value}. Объекты JSON также могут быть вложены друг в друга и представлять собой более сложную ступенчатую структуру, но для нашего случая с количественным значением достаточно будет одномерного файла.
Для того чтобы пользователю, который добавляет объект, было удобнее вводить данные количественного анализа, поле ввода JSON файла на сайте будет выглядеть не как текстовое поле, а как пара полей — ключ: значение — и возможность изменять количество этих пар (рис. 3 и 4).
Для того, чтобы была возможность прикреплять несколько фотографий (рис. 5), создаются дополнительные модели с внешним ключом Foreign Key (связь многие к одному — Many To One) для связи с главной моделью Objects [11]. Класс ForeignKey принимает два обязательных параметра:
- ссылка на класс модели, с которой будет происходить связь;
- функция on_delete, которая накладывает ограничения при удалении записи из базы данных.
Например:
Подсчет данных через формулу по введенным параметрам осуществляется с помощью функций, прописанных вручную. Например, функция подсчета площади листа:
С помощью метода __repr__ возвращается ID номер каждого объекта:
После того как все поля в models.py прописаны, таблица в базе данных еще не создана. Для формирования таблицы в PostgresSQL необходимо выполнить процедуры миграции — перенос данных в СУБД и синхронизация проекта с базой данных. Для начала создаются файлы миграций, для этого в терминале проекта выполняется команда: python manage.py makemigrations. После появляется файл миграции в приложении, который описывает таблицу в базе данных. Затем миграции проводятся с помощью команды python manage.py migrate.
3.4. Работа с панелью администратора Django и PostgreSQL
Для перехода в панель администрирования Django необходимо перейти по URL-адресу сервера с добавочным окончанием /admin. Для администрирования сайта необходимо зарегистрироваться, т. е. создать пользователя, у которого будут права администратора. Для этого в терминале выполняется команда python manage.py createsuperuser и вводятся данные пользователя (имя, пароль и т. д.) В панели администрирования Django находятся все те таблицы, с которыми возможно работать в контексте базы данных, а также управление пользователями, зарегистрированными в базе.
Чтобы работать с таблицей Objects, созданной в базе данных, необходимо зарегистрировать ее в панели администратора admin.py:
Панель администрирования Django выглядит следующим образом (рис. 6, 7 и 8):
По сути, работать с базой данных, добавлять, редактировать и удалять объекты можно уже на этом этапе, но для более удобного общего пользования базой, требуется вывести все это на сайт, а также создать удобный интерфейс.
Одновременно с выполнениями миграций, модель Objects формируется и в PostgreSQL. Для работы и просмотра базы данных в ее первоначальном виде используется приложение PgAdmin4 [12]. С помощью запросов на языке SQL (рис. 9) можно точно также администрировать, управлять и изменять базу данных через это приложение [13].
3.5. Вывод записей из базы данных на сайт
Для вывода записей необходимо импортировать модель, которую мы прописали выше в файле views.py приложения:
А для вывода всех объектов, сортированных по дате публикации, необходимо передать в нужный шаблон записи из базы данных [14]:
Для красивого и понятного отображения моделей, в файле models.py также прописывается метод __str__, который возвращает заголовок объекта:
А также необходимо прописать вывод каждого объекты в шаблоне HTML с помощью шаблонизатора и стили CSS для корректного отображения [15]:
3.6. Форма добавления объекта на сайте
Для связи модели, таблицы и сайта необходимо прописать специальную форму, в которой указывается, как будет отображаться и передаваться запрос пользователя с сайта. Для этого создается файл forms.py, куда импортируются модели и формы. В файле создается класс ModelForm, в котором указывается модель, поля, которые будут отображаться на сайте, а также виджеты и характеристики каждого отдельного поля:
После указания конкретного поля в виджетах (поля соответствуют полям модели Objects) указывается класс, на основе которого формируется поле ввода и различные атрибуты этих классов в формате словаря.
В HTML-шаблоне подключается csrf token, который обеспечивает безопасную передачу данных из формы и указывается сама форма, а точнее, все ее поля, прописанные в forms.py:
Добавляется также новое отслеживание URL адреса для страницы по созданию объекта, при переходе на который, вызывается метод create из файла views:
Здесь проверяется метод POST (тот же, что указан в HTML шаблоне), проверяется правильно ли заполнена форма методом .is_valid(), а также происходит сохранение объекта и переадресация на указанную страницу [14]. Теперь во вкладке Объекты (рис. 10) сайта базы данных, хранится список всех добавленных объектов.
Для просмотра деталей каждого объекта необходимо сделать переадресацию на новую страницу с первичным ключом (ID) объекта (динамический параметр) при нажатии кнопки «Смотреть детали», а также прописать саму страницу с деталями. В данном проекте это сделано с помощью встроенного Django класса DetailView:
Здесь передаются сама модель, шаблон, в котором будет происходить просмотр деталей и контекстное имя, т. е. ключ, по которому будет передаваться запись.
Для кнопки «Смотреть детали» передаем параметр ID каждого объекта в URL адрес:
В HTML шаблоне просмотра деталей передаются все характеристики объекта с помощью контекстного имени, указанного в классе DetailView (object):
Для создания страниц редактирования объектов используется класс UpdateView, я также тот же HTML шаблон, что и при создании объекта. Для удаления объектов применялся класс DeleteView.
Для отслеживания URL адресов необходимо указывать динамические параметры в файле urls.py нашего приложения, т. к. количество и значения ID объектов постоянно меняются. В нашем случает это целое число <int:pk> и первичный ключ:
4. Заключение
На данный момент база данных функционирует и уже пополняется различными тестовыми объектами. Каждый объект, на данный момент, содержит до 75 различных параметров и характеристик, в зависимости от проведенных исследований — историческая справка, предыдущая реставрация, результаты естественнонаучных исследование и многое другое. Параллельно с заполнением базы идут работы над сайтом, верстка и дизайн, а также улучшение и добавление различных полей для каждого объекта (например, карта, для отметки места создания или нахождения).
Хочется отметить, что огромным преимуществом этой база данных является ее динамичность — при наличии прав администратора, можно добавлять и изменять поля для заполнения каждого объекта по мере появления новых технических возможностей лаборатории, а также новых технологии исследования бумаги.
Таким образом, созданная база данных рассматривает не только отдельные справки о бумаге, как о материале, а хранит в себе полноценную информацию для обработки, анализа и исследования.
Приложение 1
Таблица 1. Поля для базы данных и форматы их ввода
№ | Название поля | Формат ввода |
1. | ID | Автоматическая нумерация при вводе |
2. | Шифр секция | Словарь |
3. | Шифр коллекция/фонд | Словарь |
4. | Шифр номер коллекции/фонда | Число |
5. | Шифр_№ дела | Число |
6. | Шифр_№ листа | Число |
7. | № образца (для образцов без шифра) | Буква + число |
8. | Год | Диапазон |
9. | Месяц | Словарь |
10. | День | Словарь |
11. | Автор | Текст |
12. | Описание краткое | Текст |
13. | Место создания | Словарь |
14. | Место создания карта | Привязка к карте по координатам |
15. | Подробное описание | Гиперссылка на основную бд |
16. | Предыдущая реставрация | Словарь |
17. | Оттенок | Словарь |
18. | Отлив | Словарь |
19. | Ориентация текста относительно верже | Словарь |
20. | Обрезка | Словарь |
21. | Сложение | Словарь |
22. | Размер листа ширина, мм | Число |
23. | Размер листа высота, мм | Число |
24. | Площадь листа, м кв. | Подсчет через формулу |
25. | Толщина листа средняя, мм | Число |
26. | Толщина листа медиана, мм | Число |
27. | Вес листа, гр. | Число |
28. | Масса 1 кв.м., гр. | Подсчет через формулу |
29. | Плотность, гр/см куб. | Подсчет через формулу |
30. | Филигрань рис | Рисунок |
31. | Филигрань высота, мм | Число |
32. | Филигрань_описание (словесное) | Текст |
33. | Филигрань_соответствие | Текст + число |
34. | Филигрань_Бернштейн [8] | Гиперссылка |
35. | Сохранность_филиграни | Словарь |
36. | Контрмарка_рис | Рисунок |
37. | Контрмарка_высота, мм | Число |
38. | Контрамарка_описание | Текст |
39. | Контрмарка_соответствие | Текст + число |
40. | Контрмарка_Бернштейн [8] | Гиперссылка |
41. | Сохранность_контрмарки | Словарь |
42. | Расстояние м/у верже, мм | Число |
43. | Расстояние м/у понтюзо, мм | Число |
44. | Толщина верже, мм | Число |
45. | Толщина понтюзо, мм | Число |
46. | Дата отливочной формы формы | Число |
47. | Белизна_средняя, cie | Число |
48. | Яркость_средняя, % | Число |
49. | Флуоресценция, % | Число |
50. | Белизна_параметры измерений | Текст |
51. | pH_среднее | Число |
52. | pH_параметры измерений | Текст |
53. | Состав по волокну Херцберг_рис | Рисунок |
54. | Состав по волокну Графф С_рис | Рисунок |
55. | Состав по волокну_описание | Словарь, мультивыбор |
56. | Поляризационная микроскопия_в поляризованном свете | Рисунок |
57. | Поляризационная микроскопия_в скрещенных николях | Рисунок |
58. | Поляризационная микроскопия_параметры измерений | Текст |
59. | РФА_рис спектра | Рисунок |
60. | РФА_количественые значения | Символ + число |
61. | РФА_спектр в формате | Файл |
62. | РФА_параметры измерений | Текст |
63. | ИК-Фурье_рис | Рисунок |
64. | ИК-Фурье_спектр в формате | Файл |
65. | ИК-Фурье_описание | Текст |
66. | ИК-Фурье спектроскопия_параметры измерений | Текст |
67. | СЭМ вторичные электроны_рис | Рисунок |
68. | СЭМ обратно рассеянные_рис | Рисунок |
69. | СЭМ_параметры измерений | Текст |
70. | ЭДС_спектр рис | Рисунок |
71. | ЭДС_спектр в формате | Файл |
75. | ЭДС_количественные значения | Символ + число |
73. | ЭДС_параметры измерений | Текст |
74. | Литература | Текст |
75. | Примечания | Текст |
Корчилава, А.В., Носова, Е.И. База данных по истории и технологии бумаги: состав, структура, особенности // Культура и технологии. 2023. Том 8. Вып. 1. С. 34-49. DOI: 10.17586/2587-800X-2023-8-1-34-49
- Богданов А.П. Основы филиграноведения. История, теория, практика. М., 1999. 326 с.
- Балаченкова А. П., Цыпкин Д. О. Возможности технологического анализа исторических бумаг в источниковедческом исследовании памятников // Вестник Санкт-Петербургского университета. История. 2017. Т. 62. Вып. 2. С. 375–399.
- Есипова В.А. К вопросу о создании электронных баз данных филиграней // Археографический ежегодник. 2000. С. 70-93.
- Карпова И.П. Базы данных. Курс лекций и материалы для практических занятий. Учебное пособие. М.: Питер, 2013. 240 с
- Сушков А., Классен Н. СУБД PostgreSQL: почему её стоит выбрать для работы с данными и как установить // Блог Яндекс Практикума. URL: https://practicum.yandex.ru/blog/chto-takoe-subd-postgresql/#id1 (дата обращения: 02.03.2023).
- Django // SkillFactory.Блог [электронный ресурс]. 2022. URL: https://blog.skillfactory.ru/glossary/django/ (дата обращения 12.10.2022)
- Конюхов В.Г., База данных. Понятие, значение и роль в современном мире // Системные технологии. 2017. №24. С. 61-61.
- Bernstein. Memory of Paper. URL: https://www.memoryofpaper.eu/BernsteinPortal/appl_start.disp (дата обращения: 24.03.2023).
- PostgreSQL: The World's Most Advanced Open Source Relational Database // PostgreSQL (электронный ресурс). 2022. URL: https://www.postgresql.org/ (дата обращения 10.10.2022)
- Форсье Дж., Биссекс П., Чан У. Django. Разработка веб-приложений на Python. Пер. с англ. СПб.: Символ-Плюс, 2009. 456 с.
- Django ORM Cookbook // DJANGO.Fun [электронный ресурс]. 2019. URL: https://django.fun/en/docs/django-orm-cookbook/2.0/ (дата обращения: 25.10.2022)
- pgAdmin 4 Documentation. Release 6.20 (2023). URL: https://www.pgadmin.org/docs/pgadmin4/6.21/index.html (дата обращения 03.03.2023)
- Новиков Б.А., Горшкова Е.А., Графеева Н.Г. Основы технологий баз данных. Учебное пособие. 2е изд. М.: ДМК Пресс, 2020. 582 с.
- Русаков М. Django View – базовые представления // Помощник Python [электронный ресурс]. 2022. URL: https://pythonpip.ru/django/django-view-bazovye-predstavleniya (дата обращения: 15.10.2022)
- Get started with Bootstrap // GitHub [электронный ресурс]. 2022. URL: https://github.com/twbs/bootstrap/blob/v5.3.0-alpha1/site/content/docs/5.3/getting-started/introduction.md (дата обращения 15.12.2022)