Разработка базы данных - Разработка и тестирование автоматизированной системы контроля успеваемости студентов

Проектирование базы данных было Подробно описано в главе 7. Благодаря графической оболочке MySQL Workbench для MySQL все SQL запросы на создание таблиц формируются автоматически. В оболочке нужно лишь задать имена столбцов, их тип и несколько параметров, таких как первичный ключ или автоматическое проставление ID. Здесь же есть возможность указать столбцы, являющиеся внешними ключами к другим таблицам. Пример лишь одного SQL запроса на создание таблицы, который генерирует MySQL Workbench, приведен ниже.

CREATE TABLE 'grades' (

'lesID' int(4) NOT NULL,

'studID' int(4) NOT NULL,

'grade' decimal(4,2) DEFAULT NULL,

'date' date DEFAULT NULL,

'teachID' int(4) DEFAULT NULL,

'weigth' decimal(2,1) DEFAULT NULL,

KEY 'IDstud_idx' ('studID'),

KEY 'IDteach_idx' ('teachID'),

KEY 'IDless_idx' ('lesID'),

CONSTRAINT 'IDless' FOREIGN KEY ('lesID') REFERENCES 'lessons' ('lesId') ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT 'IDstud' FOREIGN KEY ('studID') REFERENCES 'students' ('studId') ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT 'IDteach' FOREIGN KEY ('teachID') REFERENCES 'teachers' ('teachId') ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Далее следовало лишь частично заполнить таблицы информацией для того, чтобы было с чем работать далее при разработке клиентской части.

Следующим шагом, который необходимо выполнить для больших баз данных, является разработка триггеров. Триггеры выполняются до или после операций над таблицами, к которым они приписаны, а их использование повышает скорость работы СУБД над данными. В основном триггеры помогают обеспечивать целостность базы данных, чем ускоряют работу администратора базы данных. Например, если из родительской таблицы удалить строку, то перед этим из дочерней таблицы, где находится внешний ключ на родительскую, необходимо удалить все данные, относящиеся к удаленной строке. Если этого не будет сделано, то СУБД выдает ошибку и просит сначала удалить все внешние ключи на данную строку. В разрабатываемой системе подобные триггеры необходимы для таблиц "Курс", "Преподаватель" и "Занятие", которые могут меняться чаще всего. Пример создания триггеров для таблицы "Курс":

CREATE DEFINER='root'@'localhost' TRIGGER 'sysmp'.'kurs_BEFORE_DELETE' BEFORE DELETE ON 'kurs' FOR EACH ROW

BEGIN

Delete from kurs_group where OLD. kursId = idkurs;

delete from kurs_year where OLD. kursId = idKurs;

delete from formula where OLD. kursId = kursID;

Delete from lessons where OLD. kursId = kursID;

delete from kurs_teach where OLD. kursId = idkursKT;

END

Данный триггер начинает свою работу перед удалением какой-либо строки в таблице "Курс". Перед удалением строки из таблицы триггеры удаляют другие записи, в которых содержится внешний ключ, указывающий на ID родительской таблицы. При этом, если в дочерних таблицах тоже прописаны какие-либо триггеры для события удаления, то они выполняются в то же время, обеспечивая целостность хранимых данных.

Более сложный триггер нужен для поддержания целостности связки других таблиц, а именно "Занятие" и "Оценка". Необходимо, чтобы при внесении нового занятия в базу, в таблице "Оценка" для каждого студента по данному занятию создавалась пустая оценка и дата сдачи. Достигается это с помощью следующего триггера:

CREATE DEFINER='root'@'localhost' TRIGGER 'sysmp'.'lessons_AFTER_INSERT' AFTER INSERT ON 'lessons' FOR EACH ROW

BEGIN

Declare c int;

declare n int;

Declare ni cursor for SELECT COUNT(*) FROM students where new. grID = 'students'.'group';

Declare i cursor for select studId from students where new. grID = 'students'.'group';

open ni;

fetch ni into n;

close ni;

SET @j = 0;

Open i;

while @j < n do

Fetch i into c;

insert into grades(lesID, studID) value (new. lesId, c);

set @j = @j + 1;

end while;

close i;

END

В данном случае необходимо использование курсоров, которые являются хранилищем результата запроса, которые в них требуется записать. Первый курсор сохраняет количество студентов, которые учатся в заданной группе, а второй указатель получает ID этих студентов. Далее с помощью результата первого курсора запускается цикл, в котором из второго курсора извлекается необходимая информация, после чего происходит внесение новой строки в таблицу "Оценка".

Все остальное обеспечение целостности данных связано с вводимой информацией, проверка которой возложена на клиентское приложение. Разработка базы данных на этом считается завершенной.

Похожие статьи




Разработка базы данных - Разработка и тестирование автоматизированной системы контроля успеваемости студентов

Предыдущая | Следующая