Всем привет! 🦝 Наконец-то нашел время вернуться к дневнику. Это продолжение цикла статей про разработку приложения "Дневник Енотика". Сегодня мы закончим проектировать БД, создадим физическую модель и познакомимся с Qt Дизайнером. Предыдущую статью из цикла можно найти по ссылке ниже. Все действия выполняются в операционной системе Astra Linux CE.
🚧Завершаем проектировать БД
В предыдущей статье мы остановились на том, что создали первую сущность - запись. И получилось у нас нечто подобное. Что ж, нам осталось доделать ещё две сущности: категории и фото.
Давайте подумаем, что из себя представляет категория в электронном дневнике. Это сущность к которой будут относиться записи. Визуально это можно себе представить в виде офисных стикеров для листов. На них можно коротенько что-то написать, а также у них есть цвет.
(добавить фото примера стикеров)
Давайте добавим на нашу диаграмму сущность 🗂категория. Получится нечто подобное
И установим связь между сущностями. Данная связь указывает на то, что в одной категории может быть множество записей. Осталось добавить последнюю сущность - это 📷фото. Так как дневник у нас электронный, то фото будут храниться в виде файлов картинок. У файла есть множество атрибутов, но нам понадобятся лишь два: название и путь. Хотя название можно было бы и миновать, но в будущем оно нам понадобиться. И так, добавляем на диаграмму последнюю сущность.
Создание диаграммы сущностей с отношениями завершено, иными словами ER-диаграмма создана😊. Теперь переходим к этапу физического проектирования. Большую часть логического проектирования мы уже выполнили, а именно определили поля и ключи. Нам осталось только свести всё это дело в отдельные таблицы и задать типы данных для полей, иными словами - создать физическую модель БД. Давайте же приступать.
🖥Физическая модель
Запускаем ранее установленную SQLiteStudio, о том как её установить в Astra Linux CE, можно прочитать в статье по ссылке.
Далее нажимаем на кнопку Add a database, указываем имя и путь для сохранения файла базы данных.
Поздравляю, мы успешно создали файл базы данных. Теперь нам нужно в созданную БД добавить ранее спроектированные и описанные сущности в виде таблиц. Подключаемся к созданной БД, для этого дважды кликните по имени БД в списке баз данных слева.
Далее нажимаем правой кнопкой мыши по пункту Таблицы и в контекстном меню выбираем пункт Create a table.
Теперь давайте создадим первую таблицу. Я всегда сперва создаю таблицы не имеющие внешних ключей. У нас таких таблиц две: Категории и Фото. Давайте создадим таблицу Категории. Вводим имя таблицы в поле Имя таблицы. Имя таблицы должно быть на латинице, так как это помогает избежать проблем с кодировкой и к тому же, имя на латинице соответствует международным стандартам. Далее давайте добавим необходимые столбцы в наше таблицу. Для этого нажимаем на кнопку Добавить столбец.
В окошке Столбец, вводим имя столбца, выбираем его тип данных и указываем ограничения. На скришоте выше показано создание столбца первичного ключа, иначе говоря ID (номер записи). Поэтому в ограничениях я выбрал первичный ключ. Так как это номер записи, то тип данных у ключа будет целочисленный - INTEGER. Так же, в ограничениях, я указал Не NULL, чтобы не было возможности добавить запись с пустым первичным ключом.
📌Для первичного ключа также важно, чтобы при добавлении записи в таблицу он автоматически наращивал число. В терминологии СУБД это называется Автоинкремент. Установить его можно, перейдя в настройки первичного ключа (скриншот ниже).
В окошке Редактировать ограничение, ставим галочку рядом с пунктом Автоинкремент и нажимаем Применить. Далее в окошке столбец, также нажимаем Применить. И после всех этих манипуляций у нас в структуре таблицы появиться первый столбец.
У сущности Категории, есть ещё два атрибута: Название и Цвет. Давайте по аналогии добавим их в нашу таблицу. Для обоих этих столбцов я выбрал тип данных STRING. При создании столбца name (имя категории), я выбрал ограничение Не NULL (то есть поле не может быть пустым), чтобы не было возможности создать безымянную категорию.
По итогу у меня получилось нечто подобное. Для столбца Цвет, я так же выбрал тип данных STRING.
Теперь чтобы добавить таблицу в БД, нажимаем на кнопку Подтвердить изменения структуры.
В окошке Запросы, которые будут выполнены, нам показывают SQL. Это SQL-запрос к БД с инструкциями по созданию таблицы, нажимаем ОК.
Аналогичным образом давайте создадим таблицу для сущности Фото.
После того, как таблица сущности фото создана, давайте создадим последнюю таблицу для сущности Запись. В этой таблице у нас есть внешние ключи, это нужно будет учесть в ограничениях столбцов. Давайте разберем на примере внешнего ключа Категории.
Тип данных у внешнего ключа, должен быть таким же как и у первичного ключа в другой таблице, в нашем случае это INTEGER. Далее в настройках ограничений первичного ключа, выбираем Внешнюю таблицу, а внешний столбец определиться автоматически, если у таблицы есть первичный ключ. Для столбца Фото, настройки будут аналогичными. По итогу у меня получилось нечто подобное.
🎉Отлично! Вот мы и создали физическую модель БД.
📌Теперь пару слов о самой БД. Она не идеальна и в ней есть множество моментов, которые стоит доработать (этим мы обязательно займемся), например в БД сейчас не учтена возможность прикрепления к одной записи нескольких фотографий. Также у записи нет поля заголовка. Всё это мы доработаем в следующих статьях.
📄Создание первой формы приложения
Внешний вид нашего будущего приложения мы будем создавать в Qt Дизайнере. В Astra Linux CE, Qt Дизайнер, если у вас его нет, можно установить воспользовавшись следующей командой:
sudo apt install qttools5-dev qt5-default
Далее его можно будет найти в системном меню в разделе Разработка
Далее запускаем Дизайнер и выбираем создать MainWindow. Это будет главным окном нашего будущего приложения.
После создания формочки, давайте поместим на неё компонент Label и запишем в него какой-нибудь текст. У меня получилось нечто подобное.
Давайте теперь сохраним форму. Я назвал файл main, так как это будет главная форма приложения.
Все файлы проекта Дневник, я собираю в одной директории. И кстати, для удобства передачи этих файлов, а также для того, чтобы не вставлять в статью огромные куски исходного кода, я создал отдельный репозиторий на Github.
Ну а на сегодня все! Спасибо за прочтение! 🦝