powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД для системы заявок
16 сообщений из 16, страница 1 из 1
Проектирование БД для системы заявок
    #38824570
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня.
возникла необходимость создание системы учета заявок(да я знаю что их довольно таки много). набросал такую схему(во вложении).
Смысл в следующем: регистрируется заявка в таблице Заявки(Requests) часть информации хранится в дополнительно таблице RequestsHistory(состояние, этап,исполнитель и кто и когда создал данную запись) связь(Requests.RequestId=RequestsHistory.RequestId): 1 строке в заявках может соответствовать много строк и истории.в заявке есть ссылка на таблицу Оборудование(Equipments) необходима для отслеживания состояния оборудования и ведения статистики.
кто нибуть может подсказать/указать на ошибки данной реализации на текущем этапе
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824634
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rus, на схеме у вас таблиц несколько больше, чем в водном сообщении. Не совсем прозрачно их назначение.
Отмечу первые два момента, бросившиеся в глаза.
1. не совсем понятно, с чего в Equipments участвует поле UnitId
Связь подразделение - конкретный девайс у вас вроде как реализована через заявки. Если Equipments - конкретный девайс - мое мнение, он должен быть "отвязан" от подразделения. В противном случае может сложиться ситуация, когда в Equipments указано какое-либо подразделение, а соотв. заявки на это нет - несогласованность данных.

2. Что такое "StatesEquipment" . Если статус оборудования, который может меняться опять же путем заявки, то не логичнее ли привязать статус к конкретной заявке, дабы понимать почему данный статус изменился.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824638
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3. Ну и в догонку - всегда одна заявка - "одно оборудование"? Нельзя в рамках одной заявки "переместить" два-три -десять девайсов?
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824683
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mikle83не совсем понятно, с чего в Equipments участвует поле UnitId
тут имеется ввиду подразделение за которым закреплено оборудование;
UnitId в таблице Requests это подразделение откуда поступила заявка;

Mikle83Что такое "StatesEquipment" .
это текущее состояние оборудования. что бы было понятно почему я сделал так напишу наверно что задумывалось:
есть некий парк оборудования который обслуживается(выполняется ремонт) т.е. при поломке оборудования заводится заявка, оборудование переводится в нерабочее состояние, при закрытии заявки указывается текущее состояние оборудования. да в конкретный момент времени одна заявка подразумевает конкретное оборудование.
насчет вынесения состояния оборудования из справочника тут надо подумать я в принципе поэтому здесь и написал
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824715
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Requests
CREATE TABLE dbo.Requests (
Id INT IDENTITY,
RequestId INT NOT NULL,--номер заявки
Registered DATETIME NOT NULL,--Дата регистрации
Author NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NOT NULL, -- Автор заявки
Phone NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NOT NULL, -- телефон для связи
UnitId INT NOT NULL, -- подразделение откуда поступила заявка
PostId INT NOT NULL, -- должность автора(подумываю убрать за ненадобностью)
EquipmentId INT NOT NULL, -- Ссылка на оборудование
Description NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NOT NULL, -- описание неисправности
Closed DATETIME NULL, -- дата закрытия
CONSTRAINT PK_Requests PRIMARY KEY (Id),
CONSTRAINT KEY_Requests UNIQUE (RequestId),
CONSTRAINT FK_Requests_Equipments_Id FOREIGN KEY (EquipmentId) REFERENCES dbo.Equipments (Id),
CONSTRAINT FK_Requests_Posts_Id FOREIGN KEY (PostId) REFERENCES dbo.Posts (Id),
CONSTRAINT FK_Requests_Units_Id FOREIGN KEY (UnitId) REFERENCES dbo.Units (Id)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

RequestsHistory
CREATE TABLE dbo.RequestsHistory (
Id INT IDENTITY,
RequestId INT NOT NULL, -- ссылка на заявку
StateId INT NOT NULL, -- Состояние заявки(Справочник)
StageId INT NOT NULL, -- Этап выполнения(справочник)
PerformerId INT NOT NULL, -- исполнитель
Comment NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NOT NULL, -- коментарий
Creator INT NOT NULL,
Created DATETIME NOT NULL,
CONSTRAINT PK_RequestsHistory PRIMARY KEY (Id),
CONSTRAINT FK_RequestsHistory_Requests_RequestId FOREIGN KEY (RequestId) REFERENCES dbo.Requests (RequestId),
CONSTRAINT FK_RequestsHistory_StagesRequest_Id FOREIGN KEY (StageId) REFERENCES dbo.StagesRequest (Id),
CONSTRAINT FK_RequestsHistory_StatesRequest_Id FOREIGN KEY (StateId) REFERENCES dbo.StatesRequest (Id)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Equipments
CREATE TABLE dbo.Equipments (
Id INT IDENTITY,
Released DATETIME NULL, -- Дата выпуска
TypeId INT NOT NULL, -- тип оборудования
GroupId INT NOT NULL, --группа оборудования
Model NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- модель
UnitId INT NOT NULL, -- подразделение оборудования(за кем закреплено)
Serial NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- заводской номер
Inventory NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- инвентарный
Operational NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- эксплуатационный
StateId INT NOT NULL, --состояние оборудования на текущий момент
ServiceUnit NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- сервисное звено
Responsible NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- закрепленный сотрудник
Creator INT NOT NULL,
Created DATETIME NOT NULL,
Edited INT NOT NULL,
Editing DATETIME NOT NULL,
Deleted BIT NOT NULL,
PRIMARY KEY (Id),
CONSTRAINT FK_Equipments_StatesEquipment_Id FOREIGN KEY (StateId) REFERENCES dbo.StatesEquipment (Id),
CONSTRAINT FK_Equipments_TypesEquipment_Id FOREIGN KEY (TypeId) REFERENCES dbo.TypesEquipment (Id),
CONSTRAINT FK_Equipments_Units_Id FOREIGN KEY (UnitId) REFERENCES dbo.Units (Id)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


Остальные таблицы это справочники
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824745
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rusтут имеется ввиду подразделение за которым закреплено оборудование;
Оборудование закрепляется по заявке? Или эта система отслеживает только заявки на ремонт?
Оборудование может быть перемещено между подразделениями? Необходимо ли учитывать "историю" движения оборудования по подразделениям?

bald56rusесть некий парк оборудования который обслуживается(выполняется ремонт) т.е. при поломке оборудования заводится заявка, оборудование переводится в нерабочее состояние, при закрытии заявки указывается текущее состояние оборудования.
Логично тогда статус привязать к заявке или к истории заявки. Дабы потом можно было восстановить картину - почему и когда статус изменился.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824754
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подразделение в оборудовании теоретически может измениться.уже подумываю об вынесении некоторых полей в отдельную таблицу(например История оборудования где будет храниться история по изменения таких параметров(состояние, подразделение ну и т.п.)) из таблицы оборудования. данная система первоначально задумывалась как система учета и дальнейшего анализа технического состояния оборудования.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824921
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rusПодразделение в оборудовании теоретически может измениться.уже подумываю об вынесении некоторых полей в отдельную таблицу
У вас схема базы существенно измениться. Так что стоит задуматься будут ли характеристики оборудования, типичные исключительно для конкретного типа оборудования. Если да - то их хранение так же стоит заранее продумать.

bald56rusданная система первоначально задумывалась как система учета и дальнейшего анализа технического состояния оборудования.
На мой взгляд, в таком случае странно "смешивать" в одной таблицы статические и динамические параметры сущности.
Можно внедрить понятие "последнее значение параметра" (к примеру, последнее подразделение, в котором числиться данное оборудование) = если предполагается интенсивная работа с базой/многократные чтения и т.п.

Но тут необходимо знать вашу специфику и предполагаемую нагрузку на приложение.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38824971
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я уже начал думать о том как реализовать что некоторые параметры будут уникальны и хранение их. моих познаний хватило для следующего:
Parameters
CREATE TABLE dbo.Parameters (
Id INT IDENTITY,
Parameter NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, -- Параметр
TypeParameter NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, --Тип параметра(int,string,DateTime...)
Creator INT NOT NULL,
Created DATETIME NOT NULL,
Deleted BIT NOT NULL, --Актуальность
CONSTRAINT [PK_dbo.Parameters] PRIMARY KEY (Id)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ValueParameters
CREATE TABLE dbo.ValueParameters (
Id INT IDENTITY,
EquipmentId INT NOT NULL, -- ссылка на оборудование
ParameterId INT NOT NULL, --ссылка на параметер
Value NVARCHAR(MAX) COLLATE Cyrillic_General_CI_AS NULL, --значение параметра
Creator INT NOT NULL,
Created DATETIME NOT NULL,
Deleted BIT NOT NULL, -- актуальность
CONSTRAINT [PK_dbo.ValueParameters] PRIMARY KEY (Id),
CONSTRAINT [FK_dbo.ValueParameters_dbo.Parameters_ParameterId] FOREIGN KEY (ParameterId) REFERENCES dbo.Parameters (Id) ON DELETE CASCADE
) ON [PRIMARY]
GO


Parameters это справочник возможных параметров(состояние, подразделение ну и т.п.) в ValueParameters фактические значения параметров со ссылкой на оборудование.
Mikle83 можешь подсказать насколько это правильно или дать подсказку как бы сам реализовал. насчет нагрузки до 10000 заявок в год(исходя из предыдущего года) пользователей которые это будут делать не так много регистрация и сопровождение в системе не больше 20(думаю это будет максимум) не планируется.на основании этих данных формирование различных отчетов(типа время простоя, наличие одинаковых заявок по одному оборудование в период ну и т.п.)
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825202
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rusParameters это справочник возможных параметров(состояние, подразделение ну и т.п.) в ValueParameters фактические значения параметров со ссылкой на оборудование.
Mikle83 можешь подсказать насколько это правильно
Вполне жизнеспособный подход. Только почему связь ValueParameters -E Equipments ? По идее, наоборот: один девайс - много параметров.

Я бы подумал в сторону сущности "Список параметров" ( ListOfParameters ), который в итоге прикручивался бы к конкретному оборудованию (типу оборудования?).

Т.е. связь примерно такая:
Parameters (Id) -E ListOfParameters (Id, Param_Id, Mandatory, DefaultValue).
В TypeEquipments добавляется поле типа ListOfParameters_Id .

Создание нового объекта при этом должно повлечь за собой как минимум задание значений обязательных (Mandatory) параметров - как реализовать - тысяча и один способ: от контроля на уровне приложения и до хранимок на создание новой записи, заполняющих по дефолту - опять же нужно смотреть глубоко в суть проекта. Тут логику можно развивать до бесконечности - оценивать какие параметры могут меняться, какие статичные, какие диапазоны значений могут быть для каждого из параметров, какие маски могут быть для номеров/серийных номеров и т.п. и т.д.. Вопрос - нужно ли оно вам на практике.

Так же вопрос- надо ли вам отслеживать историю изменения параметров? Если да - нужна таблица типа History для значений.
В основной таблице значений - появляется поле UpdatedTime.


bald56rus насчет нагрузки до 10000 заявок в год(исходя из предыдущего года) пользователей которые это будут делать не так много регистрация и сопровождение в системе не больше 20(думаю это будет максимум) не планируется.на основании этих данных формирование различных отчетов(типа время простоя, наличие одинаковых заявок по одному оборудование в период ну и т.п.)
Не вижу ничего критичного в таком объеме заявок для выбранной модели
как ранее было сказано 1 заявка = 1 девайс. При этом явно количество девайсов будет меньше 10000.
Пусть будет 5000 (т.е. один девайс в среднем два раза в год попадает в "заявку") => у вас 5000 записей в таблице Equipment, пусть у каждого девайса 20 параметров (сильно сомневаюсь, но пусть) => 100 000 записей в таблице значений параметров. Ни о чем для СУБД.
При этом эта часть БД будет в большей степени статична, т.к. насколько я понимаю - большинство параметров статичны или редко изменяются.

С этой частью БД более менее понятно.
================================================================================
По запросам. Есть предположение, что запросы можно типизировать (ввести понятие тип запроса). Если так - оч. рекомендую это сделать сейчас. Потом поможет при аналитике по базе (сколько и каких типов запросов и от какого подразделения генерировалось во время каждого из лунных затмений).

Исходя из 10000 заявок в год, пусть на каждую по 5 статусов заводится - смысла в оптимизации структуры за счет введения поля "текущий статус" для заявки - я лично не вижу.

По таблицам вопрос - что такое StateRequest и StageRequest ? В чем разница?

В Request - поле Author - как будет заполняться? Это, видимо, какой-то определенный сотрудник? Инфа о нем есть в базе? Если да, то стоит добавить ИД сотрудника, если заполнять предполагается в ручную => про полезность поля можно забыть. Никакого анализа по "авторам" построить не удастся.
Так же не понятно, что делает поле телефон в таблице запросов? Почему его не подтягивать из отдела?

И поле Closed так же странно выглядит - если ввели отдельную сущность "статусы обращений", то Closed - это один из статусов.
В противном случае может быть несогласованность данных = заявка в статусе "закрыта", а в истории статусов с ней никто ничего не делал.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825337
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по поводу реализации хранения параметров мне надо хорошенько осмыслить но и за это огромное спасибо.
по поводу же заявок:
StateRequest - это состояние заявки (Открыта/В работе/Закрыта);
StageRequest - это этап выполнения(Диагностика/Поиск и закуп запчастей)
поясню как я это представляю Заявка регистрируется в система Статус "Открыта" этап "Оповещение" происходит оповещение всех необходимых лиц, после того как определен конкретный исполнитель устанавливается статус в "В работе" этап "Диагностика" работник диагностировал причину и установил конкретную проблему(необходимы запчасти) оформляются необходимые документы(счет фактура на закуп передается в бухгалтерию) устанавливается этап "Поиск и закуп запчастей" в общем как то так, т.е. эти два справочника описывают возможные состояния во время жизни заявки
Author - это тот кто подал заявку вводится диспетчером в справочник это не оформлял так как таких людей довольно таки много и они меняются. в правочнике будут только те кто может регистрировать/исполнять заявку(так же руководство для просмотра текущего состояния в целом);
Closed это ничто иное как дата закрытия заявки(точнее так дата которую может указать диспетчер(при наличии соотв. прав)) иначе же здесь будет дата время такое же как и в HistoryRequest в поле Created.задумывалось это для того что бы если вдруг фактическое закрытие по какой то причине не сделали своевременно(по заявкам ведется статистика по времени выполнения разница между полем Registered и Closed)
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825391
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rusпо поводу же заявок:
StateRequest - это состояние заявки (Открыта/В работе/Закрыта);
StageRequest - это этап выполнения(Диагностика/Поиск и закуп запчастей)
поясню как я это представляю ....
Так и не понял, что мешает заявке последовательно пройти
"Открыта -> В работе -> Диагностика -> Поиск и закупка -> Закрыта"?
и зачем два справочника. Что будет, если State = Закрыта, а Stage = Диагностика?

bald56rusClosed это ничто иное как дата закрытия заявки(точнее так дата которую может указать диспетчер
В смысле - планируемая дата закрытия заявки?

bald56rusесли вдруг фактическое закрытие по какой то причине не сделали своевременно(по заявкам ведется статистика по времени выполнения разница между полем Registered и Closed)
Хм. Некоторая избыточность есть.
У вас есть статусы заявки. Логично вычислять именно по разнице в датах присвоения статусов "Открыта"/"Закрыта".
Так же можно выводить среднее время, которое требовалось на диагностику/поиск закупку и т.п. = простор для аналитиков :)
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825415
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если будет статус "Закрыта" и какое то состояние то ничего не будет.в принципе можно и избавиться от одного справочника.по поводу Closed ситуация следующая заявки могут поступать практически в любое время оборудование работает в 1/2/3 смены диспетчер тока в одну т.е. закрытие может произойти в момент когда диспетчера фактически нет, он отработал и ушел а оборудование починили спустя 2 часа.так вот когда придет диспетчер на работу пройдет уже довольно таки много времени без этой даты простой оборудования/время жизни заявки будет больше чем на самом деле.я таким образом сделал что закрыть заявку можно задним числом простой будет считаться между датой регистрации(которая тоже может отличаться от текущего момента времени) и датой которую может указать диспетчер в качестве даты закрытия, но что бы не было злоупотреблей есть вторая дата в истории заявок где указан реальный момент времени.т.е. можно выбрать список заявок где дата закрытия отличается от факт. даты закрытия и спросить почему так.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825561
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bald56rusт.е. закрытие может произойти в момент когда диспетчера фактически нет, он отработал и ушел а оборудование починили спустя 2 часа.
Мне кажется это два отдельных статуса. Что-то типа принципа "4 глаза".
После завершения ремонта заявка переходит в статус "ремонт завершен"/"оборудование передано заказчику и т.п.". А диспетчер уже утром закрывает окончательно заявку, тем самым подтверждая этот статус, к примеру, предварительно позвонив заказчику и убедившись что "все хорошо". Или наоборот - отправляет заявку "на доработку"/заводит новую заявку если есть нарекания со стороны заказчика.

А закрывать "задним числом" - не советую. Быстро поймут как надо "правильно" закрывать заявки, тем более, если на время выполнения будет завязана премия или зарплата.
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825562
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.: я надеюсь у вас один часовой пояс? :)
...
Рейтинг: 0 / 0
Проектирование БД для системы заявок
    #38825667
bald56rus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы/советы, да думаю оду из таблиц можно и наверно даже нужно "упразднить" с переносом содержимого во вторую.
Необходимость поля "Closed" в таблице "Requests" в следующем: на текущий момент изменение статусов заявок производится одним человеком Диспетчером, т.е. для того что бы убрать возможность закрытия задним числом необходимо что изменения заявок производились конкретными специалистами т.е. исполнителями чего на текущий момент нет а тока в планах. Что бы не было "правильного закрытия" для этого в таблице истории есть поле "Created" - дата когда это было сделано(получаю время с сервера) т.е. в любой момент можно будет спросить почему эти две даты различаются. да понимаю может это и велосипед но в таком случае хотя бы какая то надежда на достоверность данных есть, если же убрать это поле то получаем не настоящие временные промежутки между зарегистрировано-закрыто.
да часовой пояс слава богу один и дата время я храню в текущем часовом поясе а не UTC :)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование БД для системы заявок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]