Белгородский государственный технологический университет
Им. В.Г.Шухова
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем.
Курсовой проект
По дисциплине
«Базы данных»
Разработка программного комплекса для работы с базой данных «Больница».
Автор работы______________ Леонов А.И.
(подпись) гр. ПВ-32
Руководитель проекта ____________ Гарибов. А.И.
(подпись)
г. Белгород 2012г.
Содержание
Введение…………………………………………...…………………….3
Постановка задачи………………………………………….…………….5
Выбор инструментов………………………………………………….….6
Структура БД……………………………………….…………………...12
Описание полей таблиц базы данных………………………………………….13
Запросы…………………………………………….…………………...14
Импорт и экспорт данных в файлы формата XML…………………......16
Заключение……………………………………………………………..17
Список литературы……………………………….……………………..18
Приложение………………………………………….………………….19
Скриншоты программы………………………….….……………..19
SQL – запросы для создания базы данных……………….…………21
Текст программы………………………..………………………...23
Введение
Любая организация нуждается в своевременном доступе к информации. Ценность информации в современном мире очень высока. Базы данных обеспечивают надежное хранение информации, структурированном виде и своевременный доступ к ней. Практически любая современная организация нуждается в базе данных, удовлетворяющей те или иные потребности по хранению, управлению и администрированию данных.
Целью выполнения курсового проекта является приобретение студентами практических навыков проектирования баз данных и разработки программного обеспечения по управлению базами данных с использованием СУБД. В ходе выполнения данного курсового проекта необходимо разработать информационную базу данных для больницы, которая поможет любому пользователю найти нужную информацию о любом сотруднике или пациенте.
Разрабатываемое ПО должно обрабатывать все эти записи, создавать новые, удалять или изменять старые. В приложении будет реализован поиск и сортировка по отдельным полям. Еще одной особенностью является использование технологий NHibernate.
NHibernate — это ORM-технология для платформы Microsoft.NET, основанная на двух вещах:
1) использование классов бизнес-логики, написанных разработчиком в качестве сущностей (POCO). POCO = Plain old CLR objects, эти классы, состоят чаще всего из свойств, их назначение — хранение данных.
2) использование XML-файлов для конфигурирования и описания мэппинга. Мэппинг - это отражение тех самых классов, написанных нами в объекты (таблицы, отношения) реляционной базы данных.
В разделах «Постановка задачи» и «Выбор инструментов» приведено описание поставленной задачи с точки зрения реализации на языке программирования высокого уровня.
В разделах «Cтруктура БД» и «Запросы» описана физическая структура БД и реализация поставленной задачи на языке высокого уровня. Так же в этих разделах описаны структура базы данных и подробно рассмотрено использовании технологии ORM (Object-Relational Mapping) на примере Fluent NHIbernate для отображения объектов на реляционную базу данных.
Постановка задачи
Необходимо спроектировать базу данных для больницы, в которой должны быть учтены все требования заказчика.
Требования были следующими:
1. База данных должна отражать всю информацию о больнице, в частности о сотрудниках и о пациентах;
2. В базе данных должна быть справочная информация для врачей о диагнозах и способах их лечения; о процедурах, которые имеются в больнице и их оплате; о лекарствах, имеющих место в медицине.
3. Должна быть возможность вносить изменения в данные и пополнения новыми данными.
4. Удобный интуитивно понятный интерфейс.
5. Скрывать данные, которые конечному пользователю не нужны, а также осуществлять проверку корректности введенных пользователя данных.
6. Поддерживать импорт и экспорт таблиц базы данных в файлы формата XML.
Выбор инструментов
В качестве СУБД была выбрана MySQL. Она соответствует всем требованиям, предъявляемым поставленной задачей.
MySQL — свободная система управления базами данных (СУБД). MySQL является собственностью компании Oracle Corporation, получившей её вместе с поглощённой Sun Microsystems, осуществляющей разработку и поддержку приложения. Распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор.
В качестве языка программирования был выбран С# и среда разработки Microsoft Visual Studio 2010. Так же используются технологии ORM (Object-Relational Mapping). Благодаря ей, мы можем отображать объекты С# на реляционную базу данных. Т.е., например, описать класс и отобразить его на таблицу в MySQL и ORM сама разберется, какие запросы надо отправлять для выборки, сохранения, обновления и удаления с сохранением связей.
В нашем приложении будет 5 вспомогательных классов, которые
Описывают сущности, находящиеся в БД, и ещё 5 классов для отображения связей с таблицами БД.
В качестве ORM технологии был выбран Fluent NHibernate - это надстройка над NHibernate. Fluent NHibernate предоставляет альтернативу стандартным XML-файлам конфигурации меппинга NHibernate. Вместо написания XML документов (.hbm.xml), Fluent NHibernate позволяет нам писать маппинг в строго типизированной форме, на языке C#. Это обеспечивает легкость рефакторинга, улучшает читабельность и лаконичность кода, экономит кучу времени. Позволяет не задумываться о том, как должны выглядеть XML файлы. Контроль типов, автоматическое подключение классов к маппингу, возможность удобной настройки соединения с базой данных и т.д. и т.п.
Для того чтобы мы могли использовать в своем проекте Fluent NHibernate, нам надо добавить ссылки на библиотеки NHibernate.dll, FluentNHibernate.Mapping, FluentNHibernate.Cfg, FluentNHibernate.Cfg.Db.
Остальные библиотеки тоже должны лежать в одном каталоге с приложением.
Чтобы подключить к нашему приложению Fluent NHibernate, достаточно описать конфигурацию подключения:
var config = Fluently.Configure()
.Database(MySQLConfiguration.Standard
.ConnectionString(x => x.Database(DataBase)
.Server(Host)
.Username(User)
.Password(Password)))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<DepartMap>())
.BuildConfiguration();
MySession = config.BuildSessionFactory();
Правила отображения для каждого класса хранятся в отдельном файле. Обычно его называют «имя_сущностиMap.cs»
Departament
Класс:
public class Departament
{
public virtual int Id { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Personnel> Personnels { get; set; }
public Departament ()
{
Personnels = new List<Personnel>();
}
public virtual void AddPersonnel(Personnel personel)
{
personel.Departament = this;
Personnels.Add(personel);
}
}
Отображение:
public class DepartMap: ClassMap<Departament>
{
public DepartMap()
{
Id(x => x.Id).Not.Nullable();
Map(x => x.Name).Not.Nullable();
HasMany(x => x.Personnels)
.Inverse()
.KeyColumn("Departament_id")
.Cascade.SaveUpdate();
}
}
Diagnosis
Класс:
public class Diagnosis
{
public virtual int Id { get; set; }//idDiagnosis
public virtual string Name { get; set; }
public virtual Departament Departament { get; set; }
public virtual Personnel Personnel { get; set; }
public virtual String Description { get; set; }
public virtual IList<Medication> Medications { get; set; }
public Diagnosis ()
{
Medications = new List<Medication>();
Description = "";
}
//Добавление лекарства к этому диагнозу
public virtual void AddMediacation (Medication med)
{
med.Diagnosis.Add(this);
Medications.Add(med);
}
}
Отображение:
public class DiagnosisMap: ClassMap<Diagnosis>
{
public DiagnosisMap()
{
Table("diagnosis");
Id(x => x.Id).Column("idDiagnosis").Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Description);
HasManyToMany(x => x.Medications)
.Table("diagnosis_has_medications")
.ParentKeyColumn("idDiagnosis")
.ChildKeyColumn("idMedications");
References(x => x.Departament)
.Column("Departament_id")
.Cascade.SaveUpdate();
References(x => x.Personnel)
.Column("Personnel_id")
.Cascade.SaveUpdate();
}
}
Medication
Класс:
public class Medication
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Numb_per_day { get; set; }
public virtual int Duration { get; set; }
public virtual decimal Price { get; set; }
public virtual string Description { get; set; }
public virtual IList<Diagnosis> Diagnosis { get; set; }
public Medication()
{
Diagnosis = new List<Diagnosis>();
Description = "";
}
//Добавление диагноза к лекарству
public virtual void AddDiagnosis (Diagnosis diagnosis)
{
Diagnosis.Add(diagnosis);
diagnosis.Medications.Add(this);
}
}
Отображение:
public class MedicationMap: ClassMap<Medication>
{
public MedicationMap()
{
Table("medications");
Id(x => x.Id).Column("idMedications").Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Numb_per_day);
Map(x => x.Duration);
Map(x => x.Price);
Map(x => x.Description);
HasManyToMany(x => x.Diagnosis)
.Table("diagnosis_has_medications")
.ParentKeyColumn("idMedications")
.ChildKeyColumn("idDiagnosis")
.Inverse();
}
}
Pacient
Класс:
public class Pacient
{
public virtual int Id { get; set; }
public virtual string Name{ get; set; }
public virtual string Address{ get; set; }
public virtual DateTime Birthday { get; set; }
public virtual DateTime Data_arrival { get; set; }
public virtual DateTime Data_depart { get; set; }
public virtual Departament Departament { get; set; }
public virtual Diagnosis Diagnosis { get; set;}
public override bool Equals(object obj)
{
if (obj is Pacient)
{
Pacient p = (obj as Pacient);
bool b = true;
if (Name!= p.Name) b = false;
if (Address!= p.Address) b = false;
if (Birthday!= p.Birthday) b = false;
if (Data_arrival!= p.Data_arrival) b = false;
if (Data_depart!= p.Data_depart) b = false;
if (Diagnosis.Departament!= p.Diagnosis.Departament) b = false;
if (Diagnosis.Name!= p.Diagnosis.Name) b = false;
if (Diagnosis.Personnel!= p.Diagnosis.Personnel) b = false;
if (Diagnosis.Description!= p.Diagnosis.Description) b = false;
if (Departament!= p.Departament) b = false;
return b;
}
else return false;
}
}
Отображение:
public class PatientMap: ClassMap<Pacient>
{
public PatientMap()
{
Table("pacienty");
Id(x => x.Id).Not.Nullable();
Map(x => x.Name).Not.Nullable();
Map(x => x.Address);
Map(x => x.Birthday);
Map(x => x.Data_arrival);
Map(x => x.Data_depart);
References(x => x.Departament, "Departament_id");
References(x => x.Diagnosis, "Diagnosis_id");
}
}
Personnel
Класс:
public class Personnel
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Address { get; set; }
public virtual DateTime Birthday { get; set; }
public virtual string Phone { get; set; }
public virtual string Post { get; set; }
public virtual decimal Salary{ get; set; }
public virtual Departament Departament{ get; set; }
public override bool Equals(object obj)
{
if (obj is Personnel)
{
Personnel p = (obj as Personnel);
bool b = true;
if (Name!= p.Name) b = false;
if (Address!= p.Address) b = false;
if (Birthday!= p.Birthday) b = false;
if (Phone!= p.Phone) b = false;
if (Post!= p.Post) b = false;
if (Salary!= p.Salary) b = false;
if (Departament!= p.Departament) b = false;
return b;
}
else return false;
}
}
Отображение:
public class PersonnelMap: ClassMap<Personnel>
{
public PersonnelMap()
{
Table("personnel");
Id(x => x.Id).Column("idPersonnel");
Map(x => x.Name);
Map(x => x.Address);
Map(x => x.Birthday);
Map(x => x.Phone);
Map(x => x.Post);
Map(x => x.Salary);
References(x => x.Departament)
.Column("Departament_id")
.Cascade.SaveUpdate();
}
}
Структура БД
Структуру базы данных можно представить диаграммой «сущность-связь»
Свойства, которыми обладают сущности:
1. Персонал: отделение, ФИО, адрес, дата рождения, телефон, должность, оклад.
2. Пациент: отделение, диагноз, ФИО, адрес, дата рождения, дата прибытия, дата выписывания.
3. Диагноз: имя, отделение, врач, описание.
4. Отдел: имя.
5. Лекарства: имя, количество в день, раз в день, цена, описание.
Физическая модель базы данных:
Описание полей таблиц базы данных
Типы данных для таблицы Personnel:
Name: строка – имя работника
Address: строка – адрес проживания
Birthday: дата – дата рождения
Phone: целое – номер телефона
Post: строка – должность
Salary: decimal – оклад
Id_depart: целое – идентификатор отделения
Типы данных для таблицы Pacienty:
Id_depart: целое – идентификатор отделения
Id_diagnos: целое – идентификатор диагноза
Name: строка – имя
Address: строка – адрес проживания
Birthday: дата – дата рождения пациента
Data_arrival: дата – дата прибытия пациента в больницу
Data_depart: дата – дата выписки из больницы
Типы данных для таблицы Diagnosis:
Id_depart: целое – идентификатор отделения
Id_doctor: целое – идентификатор врача
Name: строка – название диагноза
Типы данных для таблицы Medications:
Name: строка – наименование лекарства
Numb_per_day:целое – количество лекарства в день
Duration:целое – количество приёмов в день
Price: decimal – стоимость
Типы данных для таблицы Departament:
Id: целое – идентификатор отделения
Name: строка – имя отделения
Запросы
Рассмотрим по одному примеру для каждого запроса: запросы на выборку, удаления, добавления и изменения записей таблиц, остальные запросы представлены в тексте программы (см. приложение)
Примеры запросов для сущности Departament.
Выборка данных
public void Fill()
{
using (var session = parent.MySession.OpenSession())
{
try
{
DepartTable.Rows.Clear();
var deps = session.CreateCriteria(typeof (Departament)).List<Departament>();
foreach (var d in deps)
DepartTable.Rows.Add(d.Name);
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Ошибка подключения к БД");
}
finally
{
session.Close();
}
}
}
Функция Fill заполняет таблицу DepartTable в приложении данными из таблицы Departament, находящейся в базе данных.
Добавление записи:
void Insert(string sName)
{
using (var session = parent.MySession.OpenSession())
using (var transaction = session.BeginTransaction())
{
try
{
session.Save(new Departament {Name = sName});
transaction.Commit();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Ошибка подключения к БД");
transaction.Rollback();
}
finally
{
session.Close();
}
}
}
Функция Insert вставляет новую запись в таблицу Departament. Входные данные – имя отделения.
Обновление:
void Update(string sName)
{
using (var session = parent.MySession.OpenSession())
using (var transaction = session.BeginTransaction())
{
try
{
var newdep = GetDepByName(session, DepartTable.CurrentRow.Cells[0].Value.ToString());
newdep.Name = sName;
session.Update(newdep);
transaction.Commit();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Ошибка подключения к БД");
transaction.Rollback();
}
}
}
Функция Update обновляет выделенную запись таблицы DepartTable. Входные данные – имя отделения.
Удаление записи:
public void Delete()
{
using (var session = parent.MySession.OpenSession())
using (var transaction = session.BeginTransaction())
{
try
{
var olddep = GetDepByName(session, DepartTable.CurrentRow.Cells[0].Value.ToString());
session.Delete(olddep);
transaction.Commit();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Ошибка подключения к БД");
transaction.Rollback();
}
Функция Delete удаляет выделенную запись таблицы DepartTable из таблицы Departament.