IscanderChe29 августа 2019 г. 15:02

Проект DBComponents. Часть 1. Требования к проекту и базе данных

Требования к проекту

Проект реализует базу данных IT-компонентов. Планируется пока три категории: мониторы, медицинские принтеры, системные блоки. Также в функционал базы входит возможность создавать новые категории.

Проект должен состоять из двух функциональных частей – панели администратора и панели пользователя.

Панель администратора должна содержать следующие представления и инструменты:

  • список категорий и кнопку команды «Новая категория»;
  • список параметров категории и кнопки команд «Новый параметр» и «Редактировать параметр»;
  • список компонентов категории и кнопки команд «Новый компонент» и «Редактировать компонент».

По нажатии на кнопку:

  • «Новая категория» должно вызываться диалоговое окно создания новой категории компонентов, содержащее строки ввода имени категории в представлении (видимое имя) и имя категории для базы данных (только латиница плюс символ подчёркивания);
  • «Новый параметр» должно вызываться диалоговое окно создания нового параметра, содержащее строки ввода имени параметра в представлении (видимое имя) и имя параметра для базы данных (только латиница плюс символ подчёркивания), флажок «Заголовок подсписка» для указания, что параметр фиктивный и заполнению в базе данных не подлежит, и выпадающий список «Позиция в списке» с номерами позиций. По умолчанию номер позиции в списке следующий за последним существующим параметром;
  • «Редактировать параметр» должно вызываться диалоговое окно редактирования параметра, содержащее строку ввода имени параметра в представлении с ранее введённым значением;
  • «Новый компонент» должно вызываться диалоговое окно создания нового компонента, содержащее строки ввода ранее созданных параметров компонента. Если параметр не заполняется, то в базе данных этот параметр должен быть записан как «н/д» (нет данных);
  • «Редактировать компонент» должно вызываться диалоговое окно редактирования компонента, содержащее строки ввода параметров компонента с ранее введёнными значениями. Если параметр записан в базе данных как «н/д», строка ввода параметра должна быть пустой.

Панель пользователя должна содержать следующие представления и инструменты:

  • список категорий;
  • блок фильтров для компонентов, состоящий из строк ввода и/или выпадающих списков основных параметров (должно определяться программно, на уровне кода);
  • список компонентов для выбранной категории, удовлетворяющий условиям фильтров;
  • список параметров для выбранного компонента;
  • кнопку команды «Экспортировать в Excel», по нажатию на которую список параметров и значений параметров для выбранного компонента экспортируется в таблицу Excel.

Требования к базе данных

В отношении этой части у меня есть сомнения в правильности решения, в связи с чем я прошу уважаемое сообщество подтвердить мой выбор или предложить другой вариант решения. Заранее спасибо.

База данных должна использовать СУБД SQLite и содержать следующие таблицы:

  • таблица категорий компонентов components_category с полями id , name , view_name ;
  • таблицы параметров компонентов по количеству категорий parameters_<name> (где name – содержимое соответствующего поля таблицы категорий компонентов components_category ), с полями id , name , view_position , view_name , header ;
  • таблицы значений параметров компонентов по количеству категорий values_<name> (где name – содержимое соответствующего поля таблицы категорий компонентов components_category ), с полями id , <name1> , <name2> , … <nameN> (где name1 , name2 , … nameN – содержимое соответствующего поля name таблицы параметров компонентов parameters_<name> ).
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
ИП

Я бы сделал базу в таком виде:

CREATE TABLE "components" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" TEXT
);

CREATE UNIQUE INDEX "index"
ON "components" ("name" ASC);

CREATE TABLE "parameters" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"components_id" INTEGER,
"name" TEXT NOT NULL,
FOREIGN KEY ("components_id") REFERENCES "components" ("id") ON DELETE RESTRICT ON UPDATE RESTRICT
);

CREATE TABLE "values" (
"id" INTEGER NOT NULL,
"vparameter_id" INTEGER,
"name" TEXT,
PRIMARY KEY ("id" ASC),
FOREIGN KEY ("vparameter_id") REFERENCES "parameters" ("id") ON DELETE RESTRICT ON UPDATE RESTRICT
);
Не совсем понятно назначение поля view_position, но если сильно нужно, то его можно добавить в таблицу "parameters"
Если есть такая необходимость, то можно "ON DELETE RESTRICT" заменить на "ON DELETE CASCADE", тогда при удалении строки из "components" сразу удалятся соответствующие parameters и values

CREATE UNIQUE INDEX "index"
ON "components" ("name" ASC);

Вот эти строки поясните, для чего они.

Не совсем понятно назначение поля view_position

Это поле нужно для хранения позиции параметра в представлении, поскольку может получиться так, что добавили ещё один параметр, но он должен располагаться выше ранее введённых параметров.

при удалении строки из "components"

Т.е. то, что написано после FOREIGN KEY, относится к удалению из "components"? На данный момент удаления из "components" как такового не предполагается.

ИП

CREATE UNIQUE INDEX "index"
ON "components" ("name" ASC);
индекс на поле name, дополнительно делает поле name уникальным

| Т.е. то, что написано после FOREIGN KEY, относится к удалению из "components"? На данный момент удаления из "components" как такового не предполагается.
Так и есть, помимо этого FOREIGN KEY не дает содать parameters со значением components_id если нет соответствующего значения id в components. FOREIGN KEY обеспечивает целостность данных между 2 таблицами при добавлении и удалении данных

parameters с полем view_position будет выглядеть так:
CREATE TABLE "parameters" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"components_id" INTEGER,
"name" TEXT NOT NULL,
"view_position" INTEGER,
CONSTRAINT "fkey0" FOREIGN KEY ("components_id") REFERENCES "components" ("id") ON DELETE RESTRICT ON UPDATE RESTRICT
);

CONSTRAINT "fkey0"

А вот это для чего?

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Card image cap
Pulsum Via

Проект для путешественников от EVILEG.

Перейти
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
Поделиться в социальных сетях
Donate

Проект EVILEG перешёл на некоммерческую основу и будет развиваться исключительно на энтузиазме создателя сайта, энтузиазме пользователей, пожертвованиях и реферальной системе хостинга

Спасибо за вашу поддержку

Доступные способы поддержки проекта

PayPal

PatreonYooMoneyПодробнее
M

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
k

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
k

C++ - Тест 002. Константы

  • Результат:58баллов,
  • Очки рейтинга-2
Последние комментарии
Ds

Android и QML - Добавление Splash Screen

Интересен формат иконки, если это png, то как решается проблема scalability? не растягивается ли лого на китайфонах с 1280х2500? У меня просто сплеш скрин с градиентом и логотипом, и вот несколь…
p

Qt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

FIGURE Abdominopelvic regions. Zjuaqd https://newfasttadalafil.com/ - Cialis Cialis Recommendations for preparing children and adolescents for invasive cardiac procedures a statement…
КГ

Как использовать вложенные формы в Django

Спасибо за полезную статью. Подскажите пожалуйста, что делать если нужно реализовать большее количество вложенных форм? Например если на модель Address ссылается fk другой модели, на котору…

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

Не думаю, QMediaPlayer в один поток проигрывает. Если вам нужно одновременное воспроизведение нескольких аудиоисточников, то вам нужна Bass audio library , насколько знаю, её обычно и…
АГ

Qt/C++ - Урок 051. QMediaPlayer - Аудио плеер на Qt

есть такая вообще возможность ?
Сейчас обсуждают на форуме
АБ

Sorting the added QML elements in the ListModel

I am writing an alarm clock in QML, I am required to sort the alarms in ascending order (depending on the date or time (if there are several alarms on the same day). I've done the sorting …

Изменение поведения QGroupBox при клике на его чекбокс

Я вынес виджеты вынес за пределы QGroupBox в итоге.

QSqlRelatipnalTabelModel Qt 4.8.1 как получить id внешней связи?

Есть еще принципиально другой вариант решить раз и навсегда вопрос с полей id внешней связи. Это форкнуть Qt 4.8.1 QSqlTableModel, то есть создать свою ветку развития. Например создадим кл…

Добавление AndroidManifest.xml в cmake

Добрый день. Как добавить AndroidManifest.xml в cmake? Это не работвет set(ANDROID_PACKAGE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/android CACHE INTERNAL "")set(ANDROID_BUID_DIR ${CMAKE_C…
s

Событие wheelEvent для виджета QLineEdit

вот что получилось: gui.py from PyQt5 import QtCore, QtGui, QtWidgets class LineEdit(QtWidgets.QLineEdit): def wheelEvent(self, event): #print("_") delta = 1 if e…
О нас
Услуги
© EVILEG 2015-2022
Рекомендует хостинг TIMEWEB