50131 (609946), страница 2
Текст из файла (страница 2)
Недостатки:
1) Несоответствие реляционной модели данных
Создатель реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности они указывают на следующие проблемы SQL[3]:
А) Повторяющиеся строки
Б) Неопределённые значения (nulls)
В) Явное указание порядка колонок слева направо
Г) Колонки без имени и дублирующиеся имена колонок
Д) Отсутствие поддержки свойства «=»
Е) Использование указателей
Ж) Высокая избыточность
В опубликованном Кристофером Дейтом и Хью Дарвеном Третьем Манифесте они излагают принципы СУБД следующего поколения и предлагают язык Tutorial D, который является подлинно реляционным.
2) Сложность
Хотя SQL и задумывался, как средство работы конечного пользователя, в конце концов он стал настолько сложным, что превратился в инструмент программиста.
-
Отступления от стандартов
Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL AB), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом появляются специфичные для каждой конкретной СУБД диалекты языка SQL.
-
Сложность работы с иерархическими структурами
Ранее SQL не предлагал стандартного способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения. Например, Oracle использует выражение CONNECT BY. В настоящее время в качестве стандарта принята рекурсивная конструкция WITH.
Для управления базой данных используется СУБД. Система управления базами данных (СУБД) — специализированная программа (чаще комплекс программ), предназначенная для организации и ведения базы данных. Основные функции СУБД:
-
управление данными во внешней памяти (на дисках);
-
управление данными в оперативной памяти с использованием дискового кэша;
-
журнализация изменений, резервное копирование и восстановление базы данных после сбоев;
-
поддержка языков БД (язык определения данных, язык манипулирования данными).
Обычно современная СУБД содержит следующие компоненты:
-
ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию,
-
процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода,
-
подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД
-
а также сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы.
2. Конструкторская часть
2.1 Структура БД
БД состоит из 7 таблиц: 5 по 5 факультетам, содержащие список групп, относящихся к конкретному факультету(КМК.db, МТК.db, СЭК.db, ФНК.db, ЭИУК.db), одна содержащая список 5 факультетов(Facultets.db), и еще одна – главная, содержащая подробные сведения о каждом студенте, обучающемся в КФ МГТУ(Students.db). Программа, созданная для управления БД, будет брать и отображать сведения, как правило, лишь из последней таблицы, к остальным же будет обращаться при сортировке, нумерации, редактировании данных в БД и прочих процедурах. Таблица Facultets неизменна.
Таблица Students содержит следующие поля: Номер, ФИО, Факультет, Курс, Группа, Поощрения, Сумма, Дата выдачи, Примечание, Поездки, Примечания.
2.2 Разработка конвертера таблицы Excel в БД
Одна из первых проблем, появившихся при формировании БД, - это перенос существующих данных из простой таблицы в Excel в файл с расширением *.db. Перенести данные ручным набором не представлялось возможным из-за большого количества записей (около 3500). Поэтому помимо основного проекта DataBase был создан проект Converter. Суть его работы заключается в переносе содержимого из файла с расширением *.csv (файл такого формата представляет из себя набор ячеек таблицы Excel, разделенных между собой точкой с запятой), в таблицу Students. Тонкость работы этой программы в том, что работать она будет только для конкретного csv-файла (отформатированного конкретным образом). На выходе мы должны будем получить таблицу Students, в состав которой уже входят все студенты КФ МГТУ, т.е. с заполненными полями Номер, ФИО, Факультет, Курс, Группа. Помимо того, в каждую из 5 баз данных (КМК, МТК, СЭК, ФНК, ЭИУК) запишется список всех групп данного факультета.
2.3 Разработка интерфейса главной формы СУБД
Главная форма для отображения БД использует компонент DBGrid, а для управления БД – главное меню, имеющее следующие пункты: Файл(Функции поиска в БД), Правка (Редактирование информации в БД), Дополнительно (Процедура перевода всех записей в БД на один семестр вперед) и Справка (Открытие файла ReadMe, см. Инструкцию пользователя).
2.4 Разработка модуля отображения БД
При запуске программы мы должны получить наибольшее возможное рабочее пространство занятое компонентом DBGrid, заполненным следующим образом: сортировка осуществляется по полям Факультет, Курс, Группа, и уже в каждой группе происходит отдельная сортировка по фамилии и затем нумерация внутри группы. Для этого используется один компонент Table (отображение всей таблицы Students) и 3 компонента Query, с помощью которых мы будем осуществлять SQL-запросы для различных операций с БД (в том числе – сортировка и нумерация). Для приведения компонента DBGrid к нужному нам виду используется следующая процедура:
procedure Vid_DBGrid;
begin
With Form1.DBGrid1 do begin
//Выравниваем ширину столбцов
Columns[0].Width:=20;
Columns[1].Width:=250;
Columns[3].Width:=30;
Columns[5].Width:=100;
Columns[6].Width:=55;
Columns[7].Width:=90;
Columns[8].Width:=250;
Columns[9].Width:=100;
Columns[10].Width:=230;
//Делаем столбец поощрения всплывающим списком
With Columns[5].PickList do begin
Add('Мат. помощь');
Add('Соц. стипендия');
Add('Соц. выплаты');
Add('Другие поощрения');
end;
//Делаем столбец поездки всплывающим списком
With Columns[9].PickList do begin
Add('Москва');
Add('Снакт-Петербург');
Add('Юг');
end;
end;
end;
Для сортировки и нумерации БД каждый раз при открытии формы выполняется следующая процедура:
//Открываем БД
Table1.Active:=true;
//Открываем БД с факультетами
With Query3 do begin
Close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM Facultets.db');
Open;
end;
//счетчик записей
n:=0;
//от 1 до количества факультетов
for i:=1 to Query3.RecordCount do begin
//Открываем БД, название которой соответсвует полю факультет текущей записи в БД Факультеты
With Query2 do begin
Close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM '+Query3['Факультет']+'.db');
Open;
end;
//От 1 до количества групп на факультете
for j:=1 to Query2.RecordCount do begin
//Открываем БД студенты и считываем только те записи, в которых поле группа соответствует полю группа в текущей записи БД Факультет
With Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT *');
SQL.Add('FROM Students.db');
SQL.Add('WHERE Группа LIKE "'+Query2['Группа']+'"');
SQL.Add('ORDER BY ФИО');
Open;
end;
//От 1 до количества студентов в группе
for k:=1 to Query1.RecordCount do begin
//Добавляем в конец БД студенты запись с порядковым номером студента внутри группы
Table1.AppendRecord([k,Query1['ФИО'], Query1['Факультет'], Query1['Курс'], Query1['Группа'], Query1['Поощрения'], Query1['Сумма'], Query1['Дата выдачи'], Query1['Примечание'], Query1['Поездки'], Query1['Примечания']]);
Query1.Next;
n:=n+1;
end;
//Переходим на следующую группу
Query2.Next;
end;
//Переходим на следующий факультет
Query3.Next;
end;
//Возвращаемся к началу БД студенты
Table1.First;
//Удаляем все записи, кроме недавно добавленных
for i:=1 to n do
Table1.Delete;
2.5 Разработка средств редактирования БД
Также в курсовом проекте предусмотрено добавление и удаление студентов, а также добавление и удаление групп.
Добавление студентов осуществляется в новом окне, а сама процедура добавления заключается в нижеприведенном коде:
//Добавляем запись, поля которой соответствуют текущим значениям 3-х списков и полю Edit1 в конец БД
Form1.Table1.AppendRecord([1,Edit1.Text,ComboBox1.Items[ComboBox1.ItemIndex],ComboBox2.Items[ComboBox2.ItemIndex],ComboBox3.Items[ComboBox3.ItemIndex]]);
Form1.Table1.First;
Затем заново происходит сортировка и нумерация всей БД, чтобы сразу же поставить новую запись именно в то место таблицы Students, где она должна находиться.
Про удаление студентов будет рассказано ниже. Добавление новых групп и удаление старых – процедуры, надобность в которых возникнет лишь в результате создания новых специальностей на факультете или исчезновения старых. Осуществляются эти процедуры добавлением (удалением) записи в таблице относящейся к конкретному факультету.
2.6 Разработка системы поиска информации в БД
В курсовой работе представлено 2 варианта поиска: простой и расширенный. Простой поиск выводит в DBGrid одну запись, поле ФИО которой равно введенному в строке поиска тексту или же начинается с тех же символов.
Примечательность простого поиска в том, что он ищет все записи, соответствующие запросу, но выводит сначала лишь первую, а по кнопке «Искать далее» переходит на следующую запись. По окончании простого поиска в окне появляются 3 новые кнопки: удалить, отобразить все и добавить информацию. Первая удаляет запись, отображающуюся на данный момент, посредством следующего кода:
DataSource2.DataSet:=Table1;
Vid_DBGrid;
Table1.First;
//Находим в БД студенты удаляемую запись
for i:=1 to Table1.RecordCount do begin
if Table1['ФИО']=Query1['ФИО'] then begin
Query1.Close;
s:=Table1['Группа'];
Table1.Delete;
break;
end;
Table1.Next;
end;
//Для всех записей за ней из той же группы уменьшаем порядковый номер на 1
b:=true;
While b=true do
if Table1['Группа']=s then begin
Table1.Edit;
Table1['Номер']:=Table1['Номер']-1;
Table1.Post;
Table1.Next;
end else
b:=false;
Вторая кнопка отображает в DBGrid вновь все записи, при этом осуществляя Refresh всех записей. Третья кнопка вызывает окно добавления информации (см. рис.1), предназначенное для добавления информации к тем студентам, которые получают более одного поощрения или ездили более, чем в одну поездку. Примечательность работы этого окна заключается том, что в поле Сумма будет выводиться общая сумма, полученная студентом с момента выдачи первого поощрения.
рис.1 Окно добавления информации
2.7 Разработка функции перехода в следующий семестр
Один раз в семестр одно из полей нашей БД (Группа) должно меняться, раз в год меняется еще одно поле (Курс), а те записи, значение поля Группа которых заканчивается буквой “Д” (ЭВМ-1Д), должны удаляться из БД, но сохраняться в еще каком-нибудь месте.
Реализовано это в пункте меню Доплонительно Перейти в след. Семестр. Выпускники при выполнении этой операции удаляются из БД и записываются в файл с расширением *.csv.
procedure TForm1.N14Click(Sender: TObject);
var
i,j,k:integer;
s,st,str:string;
f:textfile;
begin
if MessageDlg('Вы уверены, что хотите перевести всех студентов в следующий семестр?',mtConfirmation,[mbOK, mbCancel],0)=mrOK then begin
assignfile(f,'Выпускники'+DateToStr(Now)+'.csv');
rewrite(f);
for i:=1 to Table1.RecordCount do begin
s:=Table1['Группа'];
j:=0;
str:='';