- •База данных
- •Введение
- •1.2 Выбор и описание автоматизируемых функций
- •1.3 Первичное описание информационного обеспечения
- •1.4 Вывод
- •2 Выявление ограничений и правил поддержания целостности
- •2.1 Уровень атрибутов
- •2.3 Уровень множеств кортежей
- •2.4 Уровень базы данных
- •2.5 Вывод
- •3.1 Составление локальных исходных er-моделей
- •Мназвание
- •3.4 Вывод
- •4 Проектирование глобальной er-модели
- •4.1 Выявление и устранение эквивалентных сущностей
- •4.2 Выявление категорий и синтез обобщающих сущностей
- •4.3 Выявление и устранение дублирования атрибутов и связей
- •5.1.3 Замена явных связей 1:м неявными
- •5.2 Спецификация ограничений и правил поддержания целостности
- •5.3 Sql-код для создания реляционной модели
- •5.4 Вывод
- •Модели соединения таблиц базы данных для реализации представлений для функции 2 «прием учащихся» представлены на рис.6.1.2.
- •Модели соединения таблиц базы данных для реализации представлений для функции 3 «сдача экзаменов» представлены на рис.6.1.3.
- •Модели соединения таблиц базы данных для реализации представлений для функции 4 «планирование учебного процесса» представлены на рис.6.1.4.
- •6.3 Sql-код для реализации представлений Функция 1 «учет кадров»
- •Функция 2 «прием учащихся»
- •Функция 3 «сдача экзаменов»
- •6.4 Вывод
- •Проектирование доступа к базе данных из локальных функций
- •7.4 Вывод
- •Список литературы
5.2 Спецификация ограничений и правил поддержания целостности
Были выявлены следующие правила поддержания целостности:
- при удалении или изменении первичного ключа «код сотрудника» в родительской таблице «Сотрудник» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакт», «Диплом», «Карьера», «Уч-П», «Экзамен», «Учебный план», «Предмет», «Занятие»;
- при удалении или изменении первичного ключа «код учащегося» в родительской таблице «Учащийся» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакты», «Уч-П», «Специализация», «Условия обучения», «Экзамен», «Занятие»;
- при удалении или изменении первичного ключа «номер телефона» в родительской таблице «Телефон» автоматически изменяются или удаляются внешние ключи в дочерних таблицах «Контакт» и «Контакты»;
- при удалении или изменении первичного ключа «код предмета» в родительской таблице «Предмет» автоматически удаляются или изменяются внешние ключи в следующих дочерних сущностях «Экзамен», «У-С», «Занятие»;
-при удалении или изменении первичного ключа «номер учебного плана» в родительской таблице «Учебный план» автоматически удаляются или изменяются внешние ключи следующих дочерних таблиц: «Учащийся», «Четверть»;
- строго запрещается удалять или изменять первичный ключ «номер четверти» родительской сущности «Четверть»;
- при удалении или изменении первичного ключа «код специальности» в родительской таблице «Специальность» автоматически удаляется или изменяется внешний ключ дочерней таблицы «Диплом»;
- при удалении или изменении первичного ключа «код родственника» в родительской таблице «Родственник» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Семья»;
- при удалении или изменении первичного ключа «номер приказа» в родительской таблице «Приказ» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Уч-П»;
- при удалении или изменении первичного ключа «код должности» в родительской таблице «Должность» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Карьера»;
- при удалении или изменении первичного ключа «код инструмента» в родительской таблице «Инструмент» автоматически удаляются или изменяются внешние ключи в дочерних таблицах «Специализация» и «Учебный план»;
- при удалении или изменении первичного ключа «код льготы» в родительской таблице «Льгота» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Условия обучения»;
5.3 Sql-код для создания реляционной модели
CREATE TABLE Сотрудник
(
код_сотрудника INT NOT NULL,
ФИО CHAR(25) NOT NULL,
пол CHAR(1) NOT NULL,
адрес CHAR(15) NOT NULL,
стаж INT NOT NULL,
дата_рождения DATE NOT NULL,
код_паспорта CHAR(15) NOT NULL,
дата_выдачи DATE NULL,
кем_выдан CHAR(10) NULL,
PRIMARY KEY (код_сотрудника, код_паспорта),
CHECK (пол IN ('М', 'Ж')),
CHECK (дата_рождения > CURRENT_DATE () – 100 AND дата_рождения < CURRENT_DATE () – 16)
);
CREATE TABLE Телефон
(
номер_телефона CHAR(10) NOT NULL,
тип_телефона CHAR(10) NULL,
примечания CHAR(15) NULL,
PRIMARY KEY (номер_телефона)
);
CREATE TABLE Должность
(
код_должности INT NOT NULL,
название_должности CHAR(10) NOT NULL,
PRIMARY KEY (код_должности)
);
CREATE TABLE Специальность
(
код_специальности INT NOT NULL,
название_специальности CHAR(10) NOT NULL,
PRIMARY KEY (код_специальности)
);
CREATE TABLE контакт
(
код_сотрудника INT,
номер_телефона CHAR(10),
PRIMARY KEY (код_сотрудника, номер_телефона),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (номер_телефона) REFERENCES Телефон ON
DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE Диплом
(
код_диплома CHAR(15) NOT NULL,
код_сотрудника INT,
код_специальности INT,
название_учебного_заведения CHAR(25) NOT NULL,
дата_окончания_учебного_заведения DATE NOT NULL,
PRIMARY KEY (код_диплома, код_сотрудника),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_специальности) REFERENCES Специальность
ON DELETE CSCADE ON UPDATE CASCADE);
CREATE TABLE Карьера
(
код_сотрудника INT,
код_должности INT,
номер_приказа INT NOT NULL,
дата_поступления DATE NOT NULL,
оклад INT NOT NULL,
дата_увольнения DATE NULL,
PRIMARY KEY (код_сотрудника, код_должности),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_должности) REFERENCES Должность ON
DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE Учащийся
(
код_учащегося INT NOT NULL,
ФИО CHAR (25) NOT NULL,
дата_рождения DATE NOT NULL,
пол CHAR(1) NOT NULL,
год_обучения INT NOT NULL,
адрес CHAR(25) NOT NULL,
код_свидетельства_о_рождении CHAR (15) NOT NULL,
дата_выдачи DATE NULL,
кем_выдано CHAR (25) NULL,
номер_учебного_плана INT NOT NULL,
PRIMARY KEY (код_учащегося, код_свидетельства),
FOREIGN KEY (номер_учебного_плана) REFERENCES Учебный план ON DELETE CASCADE ON UPDATE CASADE,
CHECK (пол IN ('М', 'Ж')),
CHECK (год_обучения >=1 AND год_обучения <=7),
CHECK (дата_рождения > CURRENT_DATE () – 100 AND дата_рождения < CURRENT_DATE () – 5)
);
CREATE TABLE Родственник
(
код_родственника INT NOT NULL,
ФИО CHAR(25) NOT NULL,
место_работы CHAR (25) NULL,
PRIMARY KEY (код_родственника)
);
CREATE TABLE Приказ
(
номер_приказа INT NOT NULL,
дата_подписания DATE NOT NULL,
код_сотрудника INT,
PRIMARY KEY (номер_приказа),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE Инструмент
(
код_инструмента INT NOT NULL,
название_инструмента CHAR(15) NOT NULL,
PRIMARY KEY (код_инструмента)
);
CREATE TABLE Льгота
(
код_льготы INT NOT NULL,
название_льготы CHAR (25) NOT NULL,
PRIMARY KEY (код_льготы)
);
CREATE TABLE Контакты
(
код_учащегося INT,
номер_телефона CHAR (10),
PRIMARY KEY (код_учащегося, номер_телефона),
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (номер_телефона) REFERENCES Телефон ON
DELETE CASCADE ON UPDATE CASCADE
);
14) CREATE TABLE Уч-П
(
код_учащегося INT,
номер_приказа INT,
дата_поступления DATE NOT NULL,
PRIMARY KEY (код_учащегося, номер_приказа),
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (номер_приказа) REFERENCES Приказ ON
DELETE CASCADE ON UPDATE CASCADE
);
15) CREATE TABLE Специализация
(код_учащегося INT,
номер_приказа INT,
код _инструмента INT,
PRIMARY KEY (код_учащегося, номер_приказа),
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (номер_приказа) REFERENCES Приказ ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_инструмента) REFERENCES Интрумент ON
DELETE CASCADE ON UPDATE CASCADE);
16) CREATE TABLE Условия_обучения
(
код_учащегося INT,
код_льготы INT,
плата_за_обучение NUMERIC NOT NULL,
дата_назначения_льготы DATE NULL,
дата_снятия_льготы DATE NULL,
PRIMARY KEY (код_учащегося, код_льготы),
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_льготы) REFERENCES Льгота ON
DELETE CASCADE ON UPDATE CASCADE
);
17) CREATE TABLE Семья
(
код_учащегося INT,
код_родственника INT,
PRIMARY KEY (код_учащегося, код_родственника),
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_родственника) REFERENCES Родственник ON
DELETE CASCADE ON UPDATE CASCADE
);
18) CREATE TABLE Предмет
(
код_предмета INT NOT NULL,
название_предмета CHAR(25) NOT NULL,
код_сотрудника INT,
PRIMARY KEY (код_предмета),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON DELETE CASCADE ON UPDATE CASCADE
);
19) CREATE TABLE Экзамен
(
год INT NOT NULL,
номер_экзамена INT NOT NULL,
код_сотрудника INT,
код_предмета INT,
код_учащегося INT,
дата DATE NOT NULL,
время_начала TIME NOT NULL,
время_окончания TIME NOT NULL,
кабинет INT NOT NULL,
тип_экзамена CHAR(15) NOT NULL,
оценка INT,
PRIMARY KEY (год, номер_экзамена),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_предмета) REFERENCES Предмет ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON
DELETE CASCADE ON UPDATE CASCADE,
CHECK (оценка>=2 AND оценка<=5),
CHECK (время_начала < время_окончания)
);
20) CREATE TABLE Учебный_план
(
номер_учебного_плана INT NOT NULL,
дата_утверждения_учебного_плана DATE NULL,
особенности MEMO NOT NULL,
код_сотрудника INT,
PRIMARY KEY (номер_учебного_плана),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
);
21) CREATE TABLE Четверть
(
год INT,
номер_четверти INT,
номер_учебного_плана INT,
PRIMARY KEY (год, номер_четверти),
FOREIGN KEY (номер_учебного_плана) REFERENCES
Учебный_план ON DELETE CASCADE ON UPDATE CASCADE
);
22) CREATE TABLE Ч-П
(
год INT,
номер_четверти INT,
код_предмета INT,
количество_часов NUMERIC NOT NULL,
PRIMARY KEY (год, номер_четверти, код_предмета),
FOREIGN KEY (год, номер_четверти) REFERENCES Четверть ON
DELETE RESTRICT ON UPDATE RESTRICT,
FOREIGN KEY (код_предмета) REFERENCES Предмет ON
DELETE CASCADE ON UPDATE CASCADE
);
23) CREATE TABLE Занятие
(
дата DATE NOT NULL,
время_начала TIME NOT NULL,
время_окончания TIME NOT NULL,
код_сотрудника INT,
код_предмета INT,
код_учащегося INT,
оценка INT NOT NULL,
PRIMARY KEY (дата, время_начала, время_окончания,
код_сотрудника),
FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_предмета) REFERENCES Предмет ON
DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (код_учащегося) REFERENCES Учащийся ON
DELETE CASCADE ON UPDATE CASCADE,
CHECK (оценка >=2 AND оценка <=5),
CHECK (время_начала < время_окончания)
);
24) CREATE TABLE План_Четверть
(
номер_учебного_плана INT,
год INT,
номер_четверти INT,
PRIMARY KEY(номер_учебного_плана, год, номер_четверти),
FOREIGN KEY (номер_учебного_плана) REFERENCES Учебный_план
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (год) REFERENCES Четверть
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (номер_четверти) REFERENCES Четверть
ON DELETE CASCADE ON UPDATE CASCADE
);
25) CREATE TABLE Уволенные_сотрудники
(
код_сотрудника INT,
ФИО CHAR(25),
дата_ увольнения DATE,
PRIMARY KEY (код_сотрудника)
);
Дополнительные ограничения
Для сотрудника дата_поступления – дата_ рождения >=16
CREATE ASSERTION рожд_пост_сотр CHECK
(NOT EXISTS
(SELECT *
FROM Сотрудник, Карьера
WHERE Сотрудник.код_сотрудника= Карьера.код_сотрудника AND Карьера.дата_поступления – Сотрудник.дата_рождения <16));
Для сотрудника
дата_поступления>=дата_окончания_учебного_заведения
CREATE ASSERTION пост_оконч_сотр CHECK
( NOT EXISTS
(SELECT *
FROM Карьера, Диплом
WHERE Карьера.код_сотрудника= Диплом.код_сотрудника AND Карьера.дата_поступления<диплом.дата_окончания_учебного_заведения));
Для учащегося дата_поступления – дата_рождения >=5
CREATE ASSERTION рожд_пост_уч CHECK
( NOT EXISTS
(SELECT *
FROM Учащийся, Уч-П
WHERE Учащийся.код_учащегося= Уч-П.код_учащегося AND
Уч-П.дата_поступления – Учащийся.дата_рождения <5));
При увольнении сотрудника табельные номера следующих за ним в списке сотрудников уменьшаются на 1
CREATE TRIGGER SCODE
ON Сотрудник
FOR DELETE
AS
UPDATE Сотрудник ON
SET Сотрудник.код_сотрудника= Сотрудник.код_сотрудника – 1
FROM Сотрудник, DELETED
WHERE Сотрудник.код_сотрудника > DELETED.код_сотрудника;
5) При исключении учащегося коды следующих за ним в списке учащихся уменьшаются на 1
CREATE TRIGGER UCODE
ON Учащийся
FOR DELETE
AS
UPDATE Учащийся ON
SET Учащийся.код_учащегося= Учащийся.код_учащегося – 1
FROM Учащийся, DELETED
WHERE Учащийся.код_учащегося > DELETED.код_учащегося;
Триггера для Microsoft SQL Server
6) Данные об уволенных сотрудниках заносятся в таблицу «Уволенные_сотрудники»
CREATE TRIGGER Увольнение
ON Сотрудник
FOR DELETE
AS
INSERT INTO Уволенные_сотрудники
VALUES (DELETED.код_сотрудника, DELETED.ФИО, DELETED.дата_увольнения);
7) Из таблицы «Уволенные_сотрудники» удаляются данные о сотруднике, уволенном более одного месяца назад
CREATE TRIGGER Проверка
ON Уволенные_сотрудники
FOR UPDATE
AS
DELETE
FROM Уволенные_сотрудники
WHERE CURRENT_DATE() – дата_увольнения >=30;