Описание полей таблиц базы данных

Белгородский государственный технологический университет

Им. В.Г.Шухова

 

 

Кафедра программного обеспечения вычислительной техники

и автоматизированных систем.

 

Курсовой проект

По дисциплине

«Базы данных»

Разработка программного комплекса для работы с базой данных «Больница».

 

 

Автор работы______________ Леонов А.И.

(подпись) гр. ПВ-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.