Степень бинарной связи M:N означает, что каждый преподаватель может вести несколько предметов, а каждый предмет может читаться несколькими преподавателями. Обязательный класс принадлежности говорит о том, что за каждой дисциплиной обязательно должен быть закреплен преподаватель. E-R диаграммы и экземпляры отношений для этого случая приведены ниже.
Экземпляры полученных отношений:
Преподаватель Читает Дисциплина
Таб. № |
ФИО |
Дисциплина |
Таб. № |
Дисциплина |
Колич. часов |
101 |
Иванов |
Математика |
101 |
Математика |
120 |
120 |
Сидоров |
Физика |
101 |
Физика |
80 |
203 |
Кузнецов |
Информатика |
101 |
Философия |
150 |
245 |
Петров |
Сопромат |
120 |
Сопромат |
90 |
Механика |
120 |
Механика |
120 |
Физика |
120 |
Информатика |
150 |
Проведя анализ на наличие функциональных зависимостей мы выделили следующие функциональные зависимости:
1. № зачетки (NZ)® ФИО (FIO), Группа (GRUPPA), Город (TOWN)
2. №зачетки (NZ), Код дисциплины (S_ID) ® Оценка (MARK)
3. Код дисциплины (S_ID) ® Наименование (SUBS), Колич. Часов (HOUR)
5. Код дисциплины (S_ID) ® Таб. № (TN)
6. Таб. № (TN) ® ФИО (FIO), Ученая степень (UCHSTEPEN), Кафедра (KAFEDRA)
1.2 Формулировка ограничений целостности
Ограничения целостности, как ограничения на значения ключевых полей в связных таблицах служат для сохранения логической структуры баз данных. Как правило, ограничения целостности реализуются на уровне приложений и являются составной частью технического задания на их разработку. Некоторые СУБД способны поддерживать определенные виды ограничений на уровне организации окружения программы. Требования целостности для ключевых полей каждого отношения приведены в таблицах.
Таблица Student (отношение «Студент»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
NZ |
№ зачетной книжки |
+ |
ключ |
Уникальность в пределах отношения; при обновлении значения в связной таблице должны изменяться одновременно; при удалении одновременно удаляется информация из связной таблицы. |
FIO |
ФИО |
Alpha |
GRUPPA |
Группа студента |
Alpha |
TOWN |
Город |
Alpha |
Таблица Marks (отношение «Оценки»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
NZ |
№ зачетной книжки |
Long integer |
Должен принадлежать домену Student.NZ |
S_ID |
Код дисциплины |
Long integer |
Должен принадлежать домену Subs.S_ID |
MARK |
Оценка за предмет |
Number |
Таблица Subs (отношение «Дисциплина»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
S_ID |
Код дисциплины |
+ |
ключ |
Уникальность в пределах отношения; при обновлении значения в связной таблице должны изменяться одновременно; при удалении одновременно удаляется информация из связной таблицы. |
Subs |
Наименование дисциплины |
Alpha |
Hour |
Количество часов |
Number |
Таблица Subj (отношение «Дисциплина2»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
S_ID |
Код дисциплины |
Long integer |
Должен принадлежать домену Subs.S_ID |
TN |
Табельный номер преподавателя |
Long integer |
Должен принадлежать домену Prepodavatel.TN |
Таблица Prepodavatel (отношение «Преподаватель»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
TN |
Табельный номер преподавателя |
+ |
ключ |
Уникальность в пределах отношения; при обновлении значения в связной таблице должны изменяться одновременно; при удалении одновременно удаляется информация из связной таблицы. |
FIO |
ФИО преподавателя |
Alpha |
UCHSTEPEN |
Ученая степень |
Alpha |
KAFEDRA |
Название кафедры |
Alpha |
Таблица Kafedra (отношение «Кафедра»).
Имя поля |
Описание |
Тип |
Примечание |
Требование |
KAFEDRA |
Название кафедры |
Alpha |
TELEPHON |
№ телефона кафедры |
Long integer |
1.3 Физическое проектирование
В качестве исходных данных для физического проектирования примем простейшую ситуацию :
¨ Задача реализуется на одном рабочем месте.
¨ Многопользовательский доступ к базе данных не предусмотрен.
В нашем случае таблицы хранятся в формате DB; все файлы базы данных располагаются на локальном диске. Здесь же хранятся файлы поддержки СУБД и файлы прикладной программы.
Важная часть физического проектирования - выбор индексных выражений для построения индексов и выбор формата хранения индексов. Для обеспечения скорости работы, особенно на операциях выборки и поиска, необходима индексация по всем ключевым полям таблиц (см. таблицы выше).
Для создания таблиц мы используем DatabaseDesktop программы BorlandDelphi. Входим в меню File -> New -> Table и выбираем тип таблицы Paradox 7. И заполняем поля таблицы. Созданные таблицы (см. Приложение 1) будут хранится в формате DB.
Глава 2 Проектирование интерфейса
Функционально приложение состоит из трех частей:
- Интерфейс ввода / корректировки БД
- Подсистема генерации печатных форм.
- Вспомогательные функции.
Каждой из этих частей соответствует опция главного меню программы.
2.1 Интерфейс ввода/корректировки БД
Главное меню представляет собой иерархическую систему из собственно главного меню и всплывающих меню, позволяющих уточнить выбор, сделанный в меню. Передача управления в процедуру обработки выбранной команды происходит при выборе надлежащей опции всплывающего меню. Для передачи управления используется механизм управления событиями.
Меню программы выглядит следующим образом.
Рис. 2. Структурная схема (дерево диалога)
Интерфейс ввода / корректировки данных позволяет вводить, исправлять либо корректировать информацию в БД. На программную поддержку интерфейса возлагается задача отслеживания как корректности действий оператора, так и ограничений целостности.
Интерфейс состоит из двух уровней. На первом из них предоставляется доступ к одной из четырех справочников – «Студенты», «Предметы», «Преподаватели» либо «Кафедры». Для доступа к этим справочникам используется экранная форма (см. Приложение 2), в которой отображается содержимое справочника в виде таблицы. На форме размещены специальные кнопки для редактирования, добавления и удаления записи. При нажатии на кнопку «Редактировать» открывается окно (см. Приложение 2), в котором содержатся поля для редактирования. Кнопка «Добавить» добавляет строку в таблицу, а кнопка «Удалить» соответственно удаляет запись.
Выбрав на экране, например, справочник «Студенты» (см. Приложение 2), пользователь получает доступ к информации, содержащейся в данном справочнике, т.е. он получает доступ к личным данным студентов: ФИО студента, номер зачетной книжки, группа, в которой обучается студент, а также город, в котором он проживает. Получив доступ к данной информации, пользователь может осуществлять ввод и корректировку данных. Аналогично и с другими справочниками. Выбрав в меню справочник «Предметы», на экранной форме (см. Приложение 3) пользователь может увидеть список дисциплин, код дисциплин и количество часов для каждой дисциплины. Выбрав в меню справочник «Преподаватели» (см. Приложение 3), пользователь на экранной форме получает доступ к личной информации преподавателей: табельному номеру преподавателя, ФИО, ученой степени и на какой кафедре он работает. Выбрав в меню справочник «Кафедры» (см. Приложение 4) пользователь видит список кафедр и их телефоны.
2.2 Генерация отчетов
Поскольку вся информация хранится в виде декомпозиции, постольку для выдачи на печать отчетов необходимо проводить обратное слияние таблиц. Это можно делать либо на логическом уровне, используя динамические связи, либо на физическом уровне.
Практически во всех современных СУБД, где используется современная техника программирования, этот вопрос решается следующим образом. Все СУБД располагают каким - либо подмножеством языка запросов SQL, встроенным в систему. Этот язык предоставляет возможность корректного взаимодействия с сервером, а также создать объединение таблиц любой сложности, в том числе и с вложенными группировками и агрегатированием данных всего лишь в одной команде Select. Кроме гибкости и мощности запросы SQL отличаются еще и высоким быстродействием - по сравнению с запросом на языке навигационного типа выборка выполняется иногда в десятки раз быстрее.
В качестве рабочего алгоритма выбрана следующая последовательность действий :
- С помощью команды Select создается выборка в курсоре SQL.
- Этот курсор устанавливается как текущая рабочая область и из него происходит вывод на печать.
Для вывода отчета пользователь может выбрать в меню вкладку «Печать». При нажатии на «Печать» открывается экранная форма (см. Приложение 4), на которой изображены две кнопки «Вывод отчета №1» и «Вывод отчета №2». При нажатии на одну из этих кнопок выводится отчет (см. Приложение 5).
Глава 3 Программная реализация
Для реализации БД и разработки интерфейса мы используем среду программирования Delphi.
Главное меню программы создаем следующим образом.
Создаем новый проект и на форме (Form1) размещаем следующие компоненты (см. Приложение 6):
1. MainMenu – этот компонент служит для создания меню программы, в свойстве Items мы прописываем наше меню, состоящее из справочников, отчетов, «о программе» и «выход».
2. Button – в данном компоненте мы изменяем свойство Caption на «Выход», щелкаем два раза по компоненту и в процедуре прописываем Close; т.е. при нажатии на эту кнопку происходит закрытие окна.
Затем для осуществления доступа к нашим созданным в DatabaseDesktop таблицам мы создаем дополнительный модуль DataModule (см. Приложение 6). На этом модуле мы размещаем следующие компоненты:
1. Query1 – в данном компоненте в свойстве DatabaseNameмы прописываем путь у нашей БД, в свойстве SQL мы прописываем текст запроса: Select * from Student
И свойству Action мы устанавливаем значение True.
2. DataSource1 – этот компонент обеспечивает доступ к БД через компонент Query1. В свойстве DataSet мы выбираем Query1.
3. Table1 – в этом компоненте в свойстве DatabaseName мы прописываем путь у нашей БД, а в свойстве TableName мы выбираем нужную нам таблицу. Затем устанавливаем для свойства Action значение True.
4. DataSource2 – этот компонент мы связываем с компонентом Table1 при помощи свойства DataSet,
Далее создаем новую форму (Form3). На ней размещаем следующие компоненты (см. Приложение 6):
1. DBGrid1 – данный компонент мы используем для отображения содержимого наших справочников. В свойстве DataSource мы прописываем DataM.DataSource2, тем самым получая доступ к справочнику.
2. Размещаем кнопку редактирования, используя при этом компонент Button. Для того, чтобы при нажатии на эту кнопку появилось окно редактирования создадим еще одну форму(см. ниже Form7). Затем щелкнем по кнопке два раза и напишем текст программы в процедуре.
procedure TForm3.Button1Click(Sender: TObject);
begin
Form7.Show; //отображение окна редактирования
end;
3. Размещаем кнопку «Добавить», используя компонент Button. Щелкаем два раза по компоненту и в открывшемся окне в процедуре procedure TForm3.Button2Click(Sender: TObject) прописываем следующий текст:
procedure TForm3.Button2Click(Sender: TObject);
begin // вставкановойстроки
DataM.Table1.Insert;
DataM.Table1.FieldByName('FIO').AsString:=' ';
DataM.Table1.FieldByName('GRUPPA').AsString:=' ';
DataM.Table1.FieldByName('TOWN').AsString:=' ';
DataM.Table1.Post;
end;
4. Размещаем кнопку «Удалить», используя все тот же компонент Button. Щелкаем два раза и пишем следующий текст:
procedure TForm3.Button3Click(Sender: TObject);
begin
DataM.Table1.Delete; // удалениезаписи
end;
5. Аналогично размещаем кнопку «Закрыть» и пишем следующий текст:
procedure TForm3.Button4Click(Sender: TObject);
begin
Close;
end;
Создаем еще одну форму (Form4), размещая на ней следующие компоненты (см. Приложение 7):
1. Кнопку Button с названием «Просмотр отчета №1», щелкаем по ней два раза и пишем следующее:
procedure TForm4.Button1Click(Sender: TObject);
begin
Form5.QuickRep1.Preview; // выводотчета
end;
2. Кнопку Button с названием «Просмотр отчета №2», щелкаем по ней два раза и пишем следующее:
procedure TForm4.Button3Click(Sender: TObject);
begin
Form6.QuickRep1.Preview;
end;
3. Кнопку Button с названием «Закрыть», щелкаем по ней два раза и пишем следующее:
procedure TForm4.Button2Click(Sender: TObject);
begin
Close;
end;
Создаем новую форму (Form5), на которой будет отображаться отчет №1. Размещаем на ней следующие компоненты (см. Приложение 7):
1. Query1 – в свойстве DatabaseName мы прописываем путь у нашей БД. И свойству Action устанавливаем значение True.
В свойстве SQL пишем следующий запрос:
Select NZ,FIO,Subs,MARK
from Student,Subs,Marks
where Student.NZ=Marks.NZ and Subs.S_ID=Marks.S_ID
ORDER BY FIO
2. QuckRep1 – данный компонент служит для отображения нужного нам отчета. В свойстве DataSet выбираем Query1.
Создаем новую форму (Form6), на которой будет отображаться отчет №2. Размещаем на ней следующие компоненты (см. Приложение 8):
1. Query1 – В свойстве DatabaseName мы прописываем путь у нашей БД. И свойству Action устанавливаем значение True.
В свойстве SQL пишем следующий запрос:
Select * from Prepodavatel ORDER BY FIO
2. QuckRep1 – данный компонент служит для отображения нужного нам отчета. В свойстве DataSet выбираем Query1.
Создаем новую форму (Form7) – это будет наше окно для редактирования. Размещаем следующие компоненты (см. Приложение 8):
1. Label1, Label2, Label3 – в свойстве Caption меняем название соответственно «ФИО», «Группа», «Город».
2. Edit1, Edit2, Edit3 – для ввода значений
3. Кнопка Button «Выполнить», щелкаем по ней два раза и пишем следующий текст:
procedure TForm7.Button1Click(Sender: TObject);
begin
DataM.Table1.Edit;
DataM.Table1.FieldByName('FIO').AsString:=Edit1.Text;
DataM.Table1.FieldByName('GRUPPA').AsString:=Edit2.Text;
DataM.Table1.FieldByName('TOWN').AsString:=Edit3.Text;
DataM.Table1.Post;
end;
4. Кнопка Button «Закрыть», щелкаем по ней два раза и пишем следующий текст:
procedure TForm7.Button2Click(Sender: TObject);
begin
Close;
end;
Создаем последнюю форму для наших справочников (Form8), на которой размещаем следующие компоненты:
1. DBGrid1 – данный компонент мы используем для отображения содержимого наших справочников. В свойстве DataSource мы прописываем DataM.DataSource1, тем самым получая доступ к справочнику.
2. Кнопку Button с названием «Закрыть», щелкаем по ней два раза и пишем следующее:
procedure TForm8.Button1Click(Sender: TObject);
begin
Close; end;
Для того чтобы при выборе в меню справочника отбражались нужные данные, мы щелкаем в компоненте MainMenu по справочнику «Студенты» и прописываем следующий текст программы:
procedure TForm1.N2Click(Sender: TObject);
begin
Form3.Show;
end;
Затем щелкаем по справочнику «Предметы» и пишем:
procedure TForm1.N3Click(Sender: TObject);
begin
Form8.Show;
DataM.Query1.SQL.Clear;
DataM.Query1.SQL.Add('Select * from Subs');
DataM.Query1.Active:=true;
end;
Далее щелкаем по справочнику «Преподаватели» и пишем:
procedure TForm1.N4Click(Sender: TObject);
begin
Form8.Show;
DataM.Query1.SQL.Clear;
DataM.Query1.SQL.Add('Select * from Prepodavatel');
DataM.Query1.Active:=true;
end;
И наконец, щелкаем по справочнику «Кафедры» и пишем следующее:
procedure TForm1.N5Click(Sender: TObject);
begin
Form8.Show;
DataM.Query1.SQL.Clear;
DataM.Query1.SQL.Add('Select * from Kafedra');
DataM.Query1.Active:=true;
end;