You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
7.1 KiB
157 lines
7.1 KiB
2 weeks ago
|
@startuml
|
||
|
!define primary_key(x) <b><color:#b8861b><&key></color> x</b>
|
||
|
!define foreign_key(x) <b><color:#aaaaaa><&key></color> x</b>
|
||
|
!define column(x) <b><color:#efefef><&media-record></color> x</b>
|
||
|
!define table(x) entity x << (T, white) >>
|
||
|
|
||
|
' left to right direction
|
||
|
|
||
|
title "Entity Relationship Diagram (ERD): exam (пополнение и провера знаний)"
|
||
|
|
||
|
' Аккаунты пользователей
|
||
|
table(account) #eaa {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
column(code): String >>"35-ичный код (логин)"
|
||
|
foreign_key(orgstructure_id): LONGSERIAL >>"идентификатор места работы"
|
||
|
}
|
||
|
|
||
|
' Оргструктура
|
||
|
table(orgstructure) #eaa {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
foreign_key(organization_id): LONGSERIAL>>"Идентификатор организации"
|
||
|
foreign_key(position_id): LONGSERIAL>>"Идентификатор должности"
|
||
|
}
|
||
|
|
||
|
orgstructure --{ account
|
||
|
|
||
|
' Организации
|
||
|
table(organization) #eaa {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
column(name): STRING >>"Наименование"
|
||
|
}
|
||
|
|
||
|
organization --{ orgstructure
|
||
|
|
||
|
' Должности
|
||
|
table(position) #eaa {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
column(name): STRING >>"Наименование"
|
||
|
}
|
||
|
|
||
|
position --{ orgstructure
|
||
|
|
||
|
' Курсы
|
||
|
' По идентификатору курса определяется положение соответствующего курса
|
||
|
' в файловой системе сервиса
|
||
|
table(course){
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
column(name): STRING >>"Наименование"
|
||
|
column(short): STRING >>"Сокращенно"
|
||
|
}
|
||
|
note top
|
||
|
Не понятно, стоит ли хранить в базе пути до контента курса,
|
||
|
или достаточно создавать курсы в виде статических директорий
|
||
|
|
||
|
Если курс состоит из тем, где будет определен порядок представления тем пользователю
|
||
|
end note
|
||
|
|
||
|
' тема
|
||
|
table(theme){
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
column(name): STRING >>"Наименование"
|
||
|
' foreign_key(course_id):LONGSERIAL >>"ID курса"
|
||
|
}
|
||
|
note top
|
||
|
Курс может состоять из одной или нескольких тем
|
||
|
тема определяет состав вопросов, которые смогут попасть в опрос по курсу
|
||
|
|
||
|
Само тело курса также возможно разбить на отдельные темы,
|
||
|
материал по которым будет оформляться в отдельных *.md файлах
|
||
|
end note
|
||
|
|
||
|
' course --{ theme
|
||
|
|
||
|
' порядок расположения тем в курсе
|
||
|
table(scheme){
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор"
|
||
|
foreign_key(course_id): LONGSERIAL >>"Идентификатор курса"
|
||
|
foreign_key(theme_id): LONGSERIAL >>"Идентификатор темы"
|
||
|
column(position) INTEGER >>"Порядковый номер темы в курсе"
|
||
|
}
|
||
|
note top
|
||
|
Схема курса
|
||
|
определяет последовательность размещения тем в курсе
|
||
|
end note
|
||
|
|
||
|
course --{ scheme
|
||
|
theme --{ scheme
|
||
|
|
||
|
' Список задач
|
||
|
table(target) #eaa {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор задачи"
|
||
|
foreign_key(orgstructure_id): LONGSERIAL >>"Идентификатор категории должности"
|
||
|
foreign_key(course_id): LONGSERIAL >>"Идентификатор курса"
|
||
|
column(questions_count): INTEGER >>"Количество вопросов для тестирования"
|
||
|
column(limit): INTEGER >>"Количество вопросов, для успешного завершения опроса"
|
||
|
}
|
||
|
note top
|
||
|
Тут формируется перечень назначенных пользователю курсов,
|
||
|
на основании наименования организации и должности работника
|
||
|
|
||
|
Тут определено общее количество вопросов для тестирвоания,
|
||
|
далее вопросы берутся случайным образом из тем, относящихся к курсу в равных пропорциях
|
||
|
end note
|
||
|
|
||
|
|
||
|
orgstructure --{ target
|
||
|
course --{ target
|
||
|
|
||
|
' Вопросы
|
||
|
table(question){
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор вопроса"
|
||
|
column(body): String >>"Содержание вопроса"
|
||
|
foreign_key(theme_id): LONGSERIAL >>"Идентификатор темы вопроса"
|
||
|
}
|
||
|
theme --{ question
|
||
|
|
||
|
table(answer){
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор ответа"
|
||
|
column(body): STRING >>"Содержание ответа"
|
||
|
foreign_key(question_id): LONGSERIAL >>"Идентификатор вопроса"
|
||
|
column(status): BOOLEAN >>"статус ответа: верно / не верно"
|
||
|
column(description): STRING >>"Пояснения, обоснование ответа"
|
||
|
}
|
||
|
question --{ answer
|
||
|
|
||
|
' Опрос
|
||
|
table(quiz) #88f {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор опроса"
|
||
|
foreign_key(account_id): LONGSERIAL >>"Идентификатор аккаунта"
|
||
|
foreign_key(target_id): LONGSERIAL >>"Идентификатор задания"
|
||
|
foreign_key(question_id): LONGSERIAL >>"Назначенный вопрос"
|
||
|
foreign_key(answer_id): LONGSERIAL >>"Идентификатор данного ответа"
|
||
|
column(datetime): DATETIME >>"Дата и время ответа"
|
||
|
}
|
||
|
question --{ quiz
|
||
|
target --{ quiz
|
||
|
account --{ quiz
|
||
|
answer --{ quiz
|
||
|
|
||
|
' Результаты
|
||
|
table(results) #88f {
|
||
|
primary_key(id): LONGSERIAL >>"Идентификатор опроса"
|
||
|
foreign_key(account_id): LONGSERIAL >>"Идентификатор аккаунта"
|
||
|
foreign_key(target_id): LONGSERIAL >>"Идентификатор задания"
|
||
|
column(status): BOOLEAN >>"сдано / не сдано"
|
||
|
column(passed): DATETIME >>"Дата завершения"
|
||
|
}
|
||
|
note top
|
||
|
Запись в таблицу результатов происходит
|
||
|
по клику кнопки в графическом интерфейсе
|
||
|
пишется время клика и пересчитываются правильные отвты
|
||
|
end note
|
||
|
quiz --{ results
|
||
|
account -down-{ results
|
||
|
|
||
|
|
||
|
@enduml
|