Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
База данных - Музыкальная школа.doc
Скачиваний:
146
Добавлен:
02.05.2014
Размер:
644 Кб
Скачать
☆

5.1.3 Замена явных связей 1:м неявными

Производится дублирование первичного ключа родительской сущности в дочерней сущности.

В результате были получены следующие сущности:

1. Сотрудник (код сотрудника, ФИО, пол, адрес, стаж, дата рождения, код паспорта, дата выдачи, кем выдан);

  1. Телефон (номер телефона, тип телефона, примечания);

  2. Должность (код должности, название должности);

  3. Специальность (код специальности, название специальности);

  4. Контакт (код сотрудника, номер телефона);

  5. Диплом (код диплома, код сотрудника, код специальности, название учебного заведения, дата окончания учебного заведения);

  6. Карьера (код сотрудника, код должности, номер приказа, дата поступления, оклад, дата увольнения);

  7. Учащийся (код учащегося, ФИО, номер учебного плана, дата рождения, пол, адрес, год обучения, код свидетельства о рождении, дата выдачи, кем выдано);

  8. Родственник (код родственника, ФИО, место работы);

  9. Приказ (номер приказа, дата подписания, код сотрудника);

  10. Инструмент (код инструмента, название инструмента);

  11. Льгота (код льготы, название льготы);

  12. Контакты (код учащегося, номер телефона);

  13. Семья (код учащегося, код родственника);

  14. Уч-П (код учащегося, номер приказа, дата поступления);

  15. Специализация (код учащегося, номер приказа, код инструмента);

  16. Условия обучения (код учащегося, код льготы, плата за обучение, дата назначения льготы, дата снятия льготы);

  17. Предмет (код предмета, название предмета, код сотрудника);

  18. Экзамен (год, номер экзамена, код сотрудника, код предмета, код учащегося, дата, время начала, время окончания, кабинет, тип экзамена, оценка);

  19. Учебный план (номер учебного плана, дата утверждения учебного плана, особенности, код сотрудника);

  20. Четверть (год, номер четверти, номер учебного плана);

  21. План_Четверть (номер учебного плана, год, номер четверти);

  22. У-С (год, номер четверти, код предмета, количество часов);

  23. Занятие (дата, время начала, время окончания, код сотрудника, код предмета, код учащегося, оценка).

5.2 Спецификация ограничений и правил поддержания целостности

Были выявлены следующие правила поддержания целостности:

- при удалении или изменении первичного ключа «код сотрудника» в родительской таблице «Сотрудник» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакт», «Диплом», «Карьера», «Уч-П», «Экзамен», «Учебный план», «Предмет», «Занятие»;

- при удалении или изменении первичного ключа «код учащегося» в родительской таблице «Учащийся» автоматически удаляются или изменяются внешние ключи в следующих дочерних таблицах: «Контакты», «Уч-П», «Специализация», «Условия обучения», «Экзамен», «Занятие»;

- при удалении или изменении первичного ключа «номер телефона» в родительской таблице «Телефон» автоматически изменяются или удаляются внешние ключи в дочерних таблицах «Контакт» и «Контакты»;

- при удалении или изменении первичного ключа «код предмета» в родительской таблице «Предмет» автоматически удаляются или изменяются внешние ключи в следующих дочерних сущностях «Экзамен», «У-С», «Занятие»;

-при удалении или изменении первичного ключа «номер учебного плана» в родительской таблице «Учебный план» автоматически удаляются или изменяются внешние ключи следующих дочерних таблиц: «Учащийся», «Четверть»;

- строго запрещается удалять или изменять первичный ключ «номер четверти» родительской сущности «Четверть»;

- при удалении или изменении первичного ключа «код специальности» в родительской таблице «Специальность» автоматически удаляется или изменяется внешний ключ дочерней таблицы «Диплом»;

- при удалении или изменении первичного ключа «код родственника» в родительской таблице «Родственник» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Семья»;

- при удалении или изменении первичного ключа «номер приказа» в родительской таблице «Приказ» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Уч-П»;

- при удалении или изменении первичного ключа «код должности» в родительской таблице «Должность» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Карьера»;

- при удалении или изменении первичного ключа «код инструмента» в родительской таблице «Инструмент» автоматически удаляются или изменяются внешние ключи в дочерних таблицах «Специализация» и «Учебный план»;

- при удалении или изменении первичного ключа «код льготы» в родительской таблице «Льгота» автоматически удаляются или изменяются внешние ключи в дочерней таблице «Условия обучения»;

5.3 SQL-код для создания реляционной модели

  1. 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)

);

  1. CREATE TABLE Телефон

(

номер_телефона CHAR(10) NOT NULL,

тип_телефона CHAR(10) NULL,

примечания CHAR(15) NULL,

PRIMARY KEY (номер_телефона)

);

  1. CREATE TABLE Должность

(

код_должности INT NOT NULL,

название_должности CHAR(10) NOT NULL,

PRIMARY KEY (код_должности)

);

  1. CREATE TABLE Специальность

(

код_специальности INT NOT NULL,

название_специальности CHAR(10) NOT NULL,

PRIMARY KEY (код_специальности)

);

  1. 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

);

  1. 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);

  1. 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

);

  1. 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)

);

  1. CREATE TABLE Родственник

(

код_родственника INT NOT NULL,

ФИО CHAR(25) NOT NULL,

место_работы CHAR (25) NULL,

PRIMARY KEY (код_родственника)

);

  1. CREATE TABLE Приказ

(

номер_приказа INT NOT NULL,

дата_подписания DATE NOT NULL,

код_сотрудника INT,

PRIMARY KEY (номер_приказа),

FOREIGN KEY (код_сотрудника) REFERENCES Сотрудник ON DELETE CASCADE ON UPDATE CASCADE

);

  1. CREATE TABLE Инструмент

(

код_инструмента INT NOT NULL,

название_инструмента CHAR(15) NOT NULL,

PRIMARY KEY (код_инструмента)

);

  1. CREATE TABLE Льгота

(

код_льготы INT NOT NULL,

название_льготы CHAR (25) NOT NULL,

PRIMARY KEY (код_льготы)

);

  1. 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 (код_сотрудника)

);

Дополнительные ограничения

  1. Для сотрудника дата_поступления – дата_ рождения >=16

CREATE ASSERTION рожд_пост_сотр CHECK

(NOT EXISTS

(SELECT *

FROM Сотрудник, Карьера

WHERE Сотрудник.код_сотрудника= Карьера.код_сотрудника AND Карьера.дата_поступления – Сотрудник.дата_рождения <16));

  1. Для сотрудника

дата_поступления>=дата_окончания_учебного_заведения

CREATE ASSERTION пост_оконч_сотр CHECK

( NOT EXISTS

(SELECT *

FROM Карьера, Диплом

WHERE Карьера.код_сотрудника= Диплом.код_сотрудника AND Карьера.дата_поступления<диплом.дата_окончания_учебного_заведения));

  1. Для учащегося дата_поступления – дата_рождения >=5

CREATE ASSERTION рожд_пост_уч CHECK

( NOT EXISTS

(SELECT *

FROM Учащийся, Уч-П

WHERE Учащийся.код_учащегося= Уч-П.код_учащегося AND

Уч-П.дата_поступления – Учащийся.дата_рождения <5));

  1. При увольнении сотрудника табельные номера следующих за ним в списке сотрудников уменьшаются на 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;

Соседние файлы в предмете Базы данных