|
|
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. возникла необходимость создание системы учета заявок(да я знаю что их довольно таки много). набросал такую схему(во вложении). Смысл в следующем: регистрируется заявка в таблице Заявки(Requests) часть информации хранится в дополнительно таблице RequestsHistory(состояние, этап,исполнитель и кто и когда создал данную запись) связь(Requests.RequestId=RequestsHistory.RequestId): 1 строке в заявках может соответствовать много строк и истории.в заявке есть ссылка на таблицу Оборудование(Equipments) необходима для отслеживания состояния оборудования и ведения статистики. кто нибуть может подсказать/указать на ошибки данной реализации на текущем этапе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 10:38 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
bald56rus, на схеме у вас таблиц несколько больше, чем в водном сообщении. Не совсем прозрачно их назначение. Отмечу первые два момента, бросившиеся в глаза. 1. не совсем понятно, с чего в Equipments участвует поле UnitId Связь подразделение - конкретный девайс у вас вроде как реализована через заявки. Если Equipments - конкретный девайс - мое мнение, он должен быть "отвязан" от подразделения. В противном случае может сложиться ситуация, когда в Equipments указано какое-либо подразделение, а соотв. заявки на это нет - несогласованность данных. 2. Что такое "StatesEquipment" . Если статус оборудования, который может меняться опять же путем заявки, то не логичнее ли привязать статус к конкретной заявке, дабы понимать почему данный статус изменился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:27 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
3. Ну и в догонку - всегда одна заявка - "одно оборудование"? Нельзя в рамках одной заявки "переместить" два-три -десять девайсов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:29 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
Mikle83не совсем понятно, с чего в Equipments участвует поле UnitId тут имеется ввиду подразделение за которым закреплено оборудование; UnitId в таблице Requests это подразделение откуда поступила заявка; Mikle83Что такое "StatesEquipment" . это текущее состояние оборудования. что бы было понятно почему я сделал так напишу наверно что задумывалось: есть некий парк оборудования который обслуживается(выполняется ремонт) т.е. при поломке оборудования заводится заявка, оборудование переводится в нерабочее состояние, при закрытии заявки указывается текущее состояние оборудования. да в конкретный момент времени одна заявка подразумевает конкретное оборудование. насчет вынесения состояния оборудования из справочника тут надо подумать я в принципе поэтому здесь и написал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 11:55 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
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 Остальные таблицы это справочники ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 12:17 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
bald56rusтут имеется ввиду подразделение за которым закреплено оборудование; Оборудование закрепляется по заявке? Или эта система отслеживает только заявки на ремонт? Оборудование может быть перемещено между подразделениями? Необходимо ли учитывать "историю" движения оборудования по подразделениям? bald56rusесть некий парк оборудования который обслуживается(выполняется ремонт) т.е. при поломке оборудования заводится заявка, оборудование переводится в нерабочее состояние, при закрытии заявки указывается текущее состояние оборудования. Логично тогда статус привязать к заявке или к истории заявки. Дабы потом можно было восстановить картину - почему и когда статус изменился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 12:41 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
Подразделение в оборудовании теоретически может измениться.уже подумываю об вынесении некоторых полей в отдельную таблицу(например История оборудования где будет храниться история по изменения таких параметров(состояние, подразделение ну и т.п.)) из таблицы оборудования. данная система первоначально задумывалась как система учета и дальнейшего анализа технического состояния оборудования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 12:51 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
bald56rusПодразделение в оборудовании теоретически может измениться.уже подумываю об вынесении некоторых полей в отдельную таблицу У вас схема базы существенно измениться. Так что стоит задуматься будут ли характеристики оборудования, типичные исключительно для конкретного типа оборудования. Если да - то их хранение так же стоит заранее продумать. bald56rusданная система первоначально задумывалась как система учета и дальнейшего анализа технического состояния оборудования. На мой взгляд, в таком случае странно "смешивать" в одной таблицы статические и динамические параметры сущности. Можно внедрить понятие "последнее значение параметра" (к примеру, последнее подразделение, в котором числиться данное оборудование) = если предполагается интенсивная работа с базой/многократные чтения и т.п. Но тут необходимо знать вашу специфику и предполагаемую нагрузку на приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 14:35 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
я уже начал думать о том как реализовать что некоторые параметры будут уникальны и хранение их. моих познаний хватило для следующего: 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(думаю это будет максимум) не планируется.на основании этих данных формирование различных отчетов(типа время простоя, наличие одинаковых заявок по одному оборудование в период ну и т.п.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 15:01 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
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 - это один из статусов. В противном случае может быть несогласованность данных = заявка в статусе "закрыта", а в истории статусов с ней никто ничего не делал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 17:15 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
по поводу реализации хранения параметров мне надо хорошенько осмыслить но и за это огромное спасибо. по поводу же заявок: StateRequest - это состояние заявки (Открыта/В работе/Закрыта); StageRequest - это этап выполнения(Диагностика/Поиск и закуп запчастей) поясню как я это представляю Заявка регистрируется в система Статус "Открыта" этап "Оповещение" происходит оповещение всех необходимых лиц, после того как определен конкретный исполнитель устанавливается статус в "В работе" этап "Диагностика" работник диагностировал причину и установил конкретную проблему(необходимы запчасти) оформляются необходимые документы(счет фактура на закуп передается в бухгалтерию) устанавливается этап "Поиск и закуп запчастей" в общем как то так, т.е. эти два справочника описывают возможные состояния во время жизни заявки Author - это тот кто подал заявку вводится диспетчером в справочник это не оформлял так как таких людей довольно таки много и они меняются. в правочнике будут только те кто может регистрировать/исполнять заявку(так же руководство для просмотра текущего состояния в целом); Closed это ничто иное как дата закрытия заявки(точнее так дата которую может указать диспетчер(при наличии соотв. прав)) иначе же здесь будет дата время такое же как и в HistoryRequest в поле Created.задумывалось это для того что бы если вдруг фактическое закрытие по какой то причине не сделали своевременно(по заявкам ведется статистика по времени выполнения разница между полем Registered и Closed) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 18:28 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
bald56rusпо поводу же заявок: StateRequest - это состояние заявки (Открыта/В работе/Закрыта); StageRequest - это этап выполнения(Диагностика/Поиск и закуп запчастей) поясню как я это представляю .... Так и не понял, что мешает заявке последовательно пройти "Открыта -> В работе -> Диагностика -> Поиск и закупка -> Закрыта"? и зачем два справочника. Что будет, если State = Закрыта, а Stage = Диагностика? bald56rusClosed это ничто иное как дата закрытия заявки(точнее так дата которую может указать диспетчер В смысле - планируемая дата закрытия заявки? bald56rusесли вдруг фактическое закрытие по какой то причине не сделали своевременно(по заявкам ведется статистика по времени выполнения разница между полем Registered и Closed) Хм. Некоторая избыточность есть. У вас есть статусы заявки. Логично вычислять именно по разнице в датах присвоения статусов "Открыта"/"Закрыта". Так же можно выводить среднее время, которое требовалось на диагностику/поиск закупку и т.п. = простор для аналитиков :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 18:51 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
если будет статус "Закрыта" и какое то состояние то ничего не будет.в принципе можно и избавиться от одного справочника.по поводу Closed ситуация следующая заявки могут поступать практически в любое время оборудование работает в 1/2/3 смены диспетчер тока в одну т.е. закрытие может произойти в момент когда диспетчера фактически нет, он отработал и ушел а оборудование починили спустя 2 часа.так вот когда придет диспетчер на работу пройдет уже довольно таки много времени без этой даты простой оборудования/время жизни заявки будет больше чем на самом деле.я таким образом сделал что закрыть заявку можно задним числом простой будет считаться между датой регистрации(которая тоже может отличаться от текущего момента времени) и датой которую может указать диспетчер в качестве даты закрытия, но что бы не было злоупотреблей есть вторая дата в истории заявок где указан реальный момент времени.т.е. можно выбрать список заявок где дата закрытия отличается от факт. даты закрытия и спросить почему так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 19:09 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
bald56rusт.е. закрытие может произойти в момент когда диспетчера фактически нет, он отработал и ушел а оборудование починили спустя 2 часа. Мне кажется это два отдельных статуса. Что-то типа принципа "4 глаза". После завершения ремонта заявка переходит в статус "ремонт завершен"/"оборудование передано заказчику и т.п.". А диспетчер уже утром закрывает окончательно заявку, тем самым подтверждая этот статус, к примеру, предварительно позвонив заказчику и убедившись что "все хорошо". Или наоборот - отправляет заявку "на доработку"/заводит новую заявку если есть нарекания со стороны заказчика. А закрывать "задним числом" - не советую. Быстро поймут как надо "правильно" закрывать заявки, тем более, если на время выполнения будет завязана премия или зарплата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 22:46 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
P.S.: я надеюсь у вас один часовой пояс? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 22:46 |
|
||
|
Проектирование БД для системы заявок
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы/советы, да думаю оду из таблиц можно и наверно даже нужно "упразднить" с переносом содержимого во вторую. Необходимость поля "Closed" в таблице "Requests" в следующем: на текущий момент изменение статусов заявок производится одним человеком Диспетчером, т.е. для того что бы убрать возможность закрытия задним числом необходимо что изменения заявок производились конкретными специалистами т.е. исполнителями чего на текущий момент нет а тока в планах. Что бы не было "правильного закрытия" для этого в таблице истории есть поле "Created" - дата когда это было сделано(получаю время с сервера) т.е. в любой момент можно будет спросить почему эти две даты различаются. да понимаю может это и велосипед но в таком случае хотя бы какая то надежда на достоверность данных есть, если же убрать это поле то получаем не настоящие временные промежутки между зарегистрировано-закрыто. да часовой пояс слава богу один и дата время я храню в текущем часовом поясе а не UTC :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2014, 06:43 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38825337&tid=1540720]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 278ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...