- •Курсовая работа по дисциплине «технологии баз данных» Тема: Проектирование и разработка базы данных для муниципальной больницы
- •Содержание
- •Введение
- •Основная часть
- •Описание объекта проектирования
- •Описание бизнес процессов
- •Описание пользователей базы данных
- •Описание цели и задач базы данных
- •Концептуальная модель
- •Реляционная модель
- •Структура таблиц
- •Объекты базы данных, решающие поставленные задачи:
- •Процедуры
- •Триггеры
- •Список литературы
Структура таблиц
Рисунок 1. Таблицы базы данных
Таблица «Отделение» («Departament»)
Таблица «Диагноз» («Diagnosis»)
Таблица «Персонал» («Employee»)
Таблица «Персонал в отделениях» («EmployeeInDepartaments»)
Таблица «Пол» («Gender»)
Таблица «Больница» («Hospital»)
Таблица «Медикаменты» («Medicine»)
Таблица «Мед. процедуры» («MedProcedure»)
Таблица «Пациент» («Pacient»)
Таблица «Специальность» («Post»)
Таблица «Прием» («Reception»)
Таблица «Расписание» («Schedule»)
Объекты базы данных, решающие поставленные задачи:
Процедуры
1. Процедура, формирующая расписание на заданный период времени:
Листинг программного кода:
create proc GetAllSchedule
@date1 datetime = null,
@date2 datetime = null
as
select
rec.TimeReception as 'Время приема',
sc.Cabinet as 'Кабинет',
(e.Surname + ' ' + (select(LEFT(e.Name,1))) + '. ' + (select(LEFT(e.MiddleName,1))) + '.') as 'Врач',
p.Name as 'Специальность',
(pac.Surname + ' ' + (select(LEFT(pac.Name,1))) + '. ' + (select(LEFT(pac.MiddleName,1))) + '.') as 'Пациент'
from
Schedule sc inner join Reception rec
on sc.ReceptionID = rec.ID
inner join Employee e
on sc.DoctorID = e.ID,
Post p,
Pacient pac
where
e.PostID = p.ID and rec.PacientID = pac.ID
and
(rec.TimeReception >= @date1 or @date1 is null)
and
(rec.TimeReception <= @date2 or @date2 is null)
order by
rec.TimeReception
go
Вызов процедуры:
exec dbo.GetAllSchedule
@date1 = '2012-01-01',
@date2 = '2012-01-05'
go
Результат выполнения процедуры:
Вызов процедуры:
exec GetAllSchedule
@date1 = '2012-01-04' --начальная дата
go
Результат выполнения процедуры:
2. Процедура, формирующая отчет о врачах проводивших прием у указанного больного
Листинг программного кода:
create proc GetDoctorByPacientOrPost
@surname varchar(15) = null,
@name varchar(15) = null,
@middleName varchar(15) = null,
@date date = null,
@post varchar(60) = null
as
select distinct
e.Surname as 'Фамилия',
e.Name as 'Имя',
e.MiddleName as 'Отчество',
p.Name as 'Специальность'
from
Employee e inner join Post p on e.PostID = p.ID,
Schedule sc,
Reception rep,
Pacient pac
where
(sc.DoctorID = e.ID)
and
(p.Name = @post or @post is null)
and
(sc.ReceptionID in
(
select
rec.ID
from
Reception rec inner join Pacient p
on rec.PacientID = p.ID
where
(p.Surname = @surname or @surname is null)
and
(p.Name = @name or @name is null)
and
(p.MiddleName = @middleName or @middleName is null)
and
(@date = (select(CAST(rec.TimeReception as date))) or @date is null)
)
)
go
Вызов процедуры:
exec GetDoctorByPacientOrPost
@surname = 'Мельничук'
go
Результат выполнения процедуры:
Вызов процедуры:
exec GetDoctorByPacientOrPost
@surname = 'Филипинко',
@name = 'Алексей',
@date = '2011-12-15'
go
Результат выполнения процедуры:
Вызов процедуры:
exec GetDoctorByPacientOrPost
@ambulanceNo = 153568,
@post = 'Эндокринолог'
go
Результат выполнения процедуры:
3. Процедура, формирующая историю болезни пациента
Листинг программного кода:
create proc GetPacientHistory
@surname varchar(15) = null,
@name varchar(15) = null,
@middleName varchar(15) = null,
@date1 datetime = null,
@date2 datetime = null,
@nomer int = null
as
select
r.TimeReception as 'Время и дата приема',
p.Surname as 'Фамилия',
p.Name as 'Имя',
p.MiddleName as 'Отчество',
d.Name as 'Диагноз',
m.Name as 'Выписанное лекарство',
medproc.Name as 'Назначенная процедура',
r.Notice as 'Заметка врача'
from
Reception r
inner join Pacient p
on r.PacientID = p.ID
inner join Diagnosis d
on r.DiagnosisID = d.ID
inner join Medicine m
on r.MedicineID = m.ID
inner join MedProcedure medproc
on r.MedProcedureID = medproc.ID
where
(p.Surname = @surname or @surname is null)
and
(p.Name = @name or @name is null)
and
(p.MiddleName = @middleName or @middleName is null)
and
(r.TimeReception >= @date1 or @date1 is null)
and
(r.TimeReception <= @date2 or @date2 is null)
and
(p.AmbulanceNo = @nomer or @nomer is null)
go
Вызов процедуры:
exec GetPacientHistory
@middleName = 'Владимировна',
@name = 'Ирина'
go
Результат выполнения процедуры:
Вызов процедуры:
exec GetPacientHistory
@nomer = 154987,
@date1 = '2012-01-02'
go
Результат выполнения процедуры:
Вызов процедуры:
exec GetPacientHistory
@surname = 'Мельничук,
@date1 = '2011-05-04',
@date2 = '2012-01-11'
go
Результат выполнения процедуры:
4. Процедура, отображающая количество врачей указанной специальности
Листинг программного кода:
create proc GetDoctorsCountWithPost
@post varchar(60) = null,
@count int out
as
select distinct
COUNT(*) as 'Количество'
from
Employee e
inner join Post p
on e.PostID = p.ID
where
p.Name = @post
go
Вызов процедуры:
exec GetDoctorsCountWithPost
@post = 'Терапевт'
go
Результат выполнения процедуры:
5. Процедура, формирующая отчет обо всех приемах, проведенных указанным врачом
Листинг программного кода:
create proc GetAllReceptionsAtDoctor
@surname varchar(15) = null,
@name varchar(15) = null,
@middleName varchar(15) = null,
@post varchar(60) = null
as
select
r.TimeReception as 'Время и дата приема',
p.Surname as 'Фамилия',
p.Name as 'Имя',
p.MiddleName as 'Отчество',
p.AmbulanceNo as 'Номер абул. карты',
d.Name as 'Диагноз',
m.Name as 'Выписанное лекарство',
medproc.Name as 'Назначенная процедура',
r.Notice as 'Заметка врача'
from
Reception r
inner join Pacient p
on r.PacientID = p.ID
inner join Diagnosis d
on r.DiagnosisID = d.ID
inner join Medicine m
on r.MedicineID = m.ID
inner join MedProcedure medproc
on r.MedProcedureID = medproc.ID
where
r.ID in
(
select
sc.ID
from
Schedule sc
inner join Employee e
on sc.DoctorID = e.ID,
Post post
where
(e.PostID = post.ID)
and
(e.Surname = @surname or @surname is null)
and
(e.Name = @name or @name is null)
and
(e.MiddleName = @middleName or @middleName is null)
and
(@post = post.Name or @post is null)
)
go
Вызов процедуры:
exec GetAllReceptionsAtDoctor
@surname = 'Сидоров'
go
Результат выполнения процедуры:
exec GetAllReceptionsAtDoctor
@middleName = 'Дмитриевич',
@post = 'хирург'
go
Результат выполнения процедуры:
6. Процедура, отображающая информацию об указанном медикаменте
Листинг программного кода:
create proc GetInfoAboutMedicine
@name varchar(20)
as
select
m.Name as 'Название',
m.IndicationFor as 'Показания к применению',
m.Contraindication as 'Противопоказания'
from
Medicine m
where
m.Name = @name
go
Вызов процедуры:
exec GetInfoAboutMedicine
@name = 'Омепразол'
Go
Результат выполнения процедуры:
7. Процедура, формирующая отчет обо всех сотрудниках во всех (или выбранном) отделениях
Листинг программного кода:
create proc GetEmployeeInDepartaments
@departament varchar(60) = null
as
select
(e.Surname + ' ' + (select(LEFT(e.Name,1))) + '. ' + (select(LEFT(e.MiddleName,1))) + '.') as 'Врач',
dep.Name as 'Отделение'
from
EmployeeInDepartaments eid inner join Employee e
on eid.EmployeeID = e.ID
inner join Departament dep
on eid.DepartamentID = dep.ID
where
dep.Name = @departament or @departament is null
order by
dep.Name
go
Вызов процедуры:
exec GetEmployeeInDepartaments
Результат выполнения процедуры:
8. Процедура, формирующая список всех пациентов
Листинг программного кода:
create proc GetAllPacient
as
select
pac.Surname as 'Фамилия',
pac.Name as 'Имя',
pac.MiddleName as 'Отчество',
gend.Name as Пол',
pac.DateBirth as 'Дата рождения',
pac.AmbulanceNo as 'Номер абмул. карты'
from
Pacient pac
inner join Gender gend
on pac.GenderID = gend.ID
go
Вызов процедуры:
exec GetAllPacient
Результат выполнения процедуры:
9. Процедура, формирующая список всех врачей в указанном отделении и количество приемов, проведенных каждым из них.
Листинг программного кода:
create procedure GetCountOfReceptionsInChoosenDep
@name varchar(60)
as
select
e.Surname,
e.Name,
e.MiddleName,
p.Name,
count(sc.ReceptionID) as 'Количество приемов'
from
Employee e,
Post p,
Schedule sc
where
sc.DoctorID = e.ID
and
e.PostID = p.ID
group by
e.ID,e.Name,e.MiddleName,e.Surname,p.Name
having
e.ID in
(select EmployeeInDepartaments.EmployeeID from EmployeeInDepartaments
where EmployeeInDepartaments.DepartamentID = (select Departament.ID from Departament where Departament.Name = @name))
go
Вызов процедуры:
exec GetCountOfReceptionsInChoosenDep
@name = 'Хирургическое'
Результат выполнения процедуры:
10. Процедура, отображающая доктора(ов), которые провели наибольшее количество приемов. В качестве входящего параметра выступает специальность доктора.
Листинг программного кода:
create procedure GetMaxReceptionsAtPost
@post varchar(20)
as
select
q2.Surname as 'Фамилия',
q2.Name as 'Имя',
q2.MiddleName as 'Отчество',
q2.receptions as 'Количество приемов'
from
(
select
max(q1.receptions) as 'count'
from
(
select
e.Surname,e.Name,e.MiddleName,
count(sc.ReceptionID) as 'receptions'
from
Employee e,
Post p,
Schedule sc
where
sc.DoctorID = e.ID
and
e.PostID = p.ID
and
p.Name = @post
group by
e.ID,e.Surname,e.Name,e.MiddleName
) q1
) qmax,
(
select
e.Surname,e.Name,e.MiddleName,
count(sc.ReceptionID) as 'receptions'
from
Employee e,
Post p,
Schedule sc
where
sc.DoctorID = e.ID
and
e.PostID = p.ID
and
p.Name = @post
group by
e.ID,e.Surname,e.Name,e.MiddleName
) q2
where
q2.receptions = qmax.count
go
Вызов процедуры:
exec GetMaxReceptionsAtPost
@post = 'хирург'
Результат работы процедуры: