IscanderChe
29 августа 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> ).

По статье задано0вопрос(ов)

3

Вам это нравится? Поделитесь в социальных сетях!

ИП
  • 30 августа 2019 г. 11:34

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

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

IscanderChe
  • 30 августа 2019 г. 12:41

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

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

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

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

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

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

ИП
  • 30 августа 2019 г. 13:12
  • (ред.)

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
);

IscanderChe
  • 30 августа 2019 г. 13:40

CONSTRAINT "fkey0"

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

Комментарии

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