- •Базы данных
- •Определения
- •Аспекты целостности
- •Пути поддержания целостности БД
- •Декларативная реализация целостности
- •Декларативная реализация целостности
- •Декларативная реализация целостности
- •Декларативная реализация целостности
- •Декларативная реализация целостности
- •Декларативная реализация целостности
Базы данных
Целостность реляционной модели данных
Определения
Целостность – соответствие информационной модели предметной области, хранимой в базе данных, объектам реального мира и взаимосвязям в каждый момент времени.
Аспекты целостности
Три аспекта целостности:
Структурная целостность (обеспечивается реляционной моделью данных):
-Наличие первичного ключа
-Отсутствие дубликатов кортежей
-Отсутствие зависимости от порядка кортежей
Ссылочная целостность (обеспечивается СУБД) – выполняется одно из двух правил:
1) При удалении кортежа из родительского отношения, удаляются все связанные с ним кортежи подчиненного отношения (каскадное удаление)
2) При удалении кортежа из родительского отношения, на место ключа в связанных кортежах подчиненного отношения ставится значение NULL.
Семантическая целостность (обеспечивается разработчиком и соответствующими средствами СУБД):
Автоматическое выполнение условий (бизнес-правил), определенных в предметной области.
Например: возраст читателя не менее 17 лет, читатель не может брать более 5 книг, у читателя должен быть или домашний, или служебный телефон, и т.д.
Пути поддержания целостности БД
Два пути поддержания целостности БД:
Декларативный путь – задаются правила в виде ограничений для данных
Процедурный путь – программная (алгоритмическая) реализация правил, т.е. описание действий, выполняемых при изменении базы данных (триггеры и транзакции)
Декларативная реализация целостности
CREATE TABLE <имя таблицы> (<описание элемента таблицы> [,… n])
<описание элемента таблицы> ::= <определение столбца> | <ограничение таблицы>
<определение столбца> ::= <имя столбца> <тип данных> [<значение по умолчанию>] [<ограничения столбца>] <значение по умолчанию> ::= [DEFAULT <выражение>] |
[IDENTITY (<нач.значение>, <приращение>)]
<ограничение столбца> ::= [CONSTRAINT <имя ограничения>] { [NULL | NOT NULL] [
{PRIMARY KEY | UNIQUE} |
[ [FOREIGN KEY] REFERENCES <имя таблицы> (<имя столбца>) ] [ON DELETE {CASCADE | NO ACTION}]
[ON UPDATE {CASCADE | NO ACTION}] ] |
CHECK <логическое выражение>}
Декларативная реализация целостности
<ограничение таблицы> ::= [ CONSTRAINT <название ограничения> ] { [ { PRIMARY KEY | UNIQUE } { ( <столбец>[ ,...n ] ) } ] |
FOREIGN KEY ( <столбец>[ ,...n ] )
REFERENCES <родительская таблица>[ ( <столбец ссылки>[ ,...n ] ) ] [ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] | CHECK (<логическое выражение>)}
Декларативная реализация целостности
Концептуальная схема базы данных «Библиотека»
Publications = <isbn, title, author, public_year, pages> (ISBN – уникальный код издания, название, автор, год издания, количество страниц)
Readers = <reader_id, last_name, first_name, second_name, work_phone, home_phone>
(номер читательского билета, фамилия читателя, имя, отчество, номер служебного телефона, номер домашнего телефона)
Exemplars = <inv, isbn, reader_id, date_out> (инвентарный номер – естественный первичный ключ, ISBN издания, номер читательского билета, дата выдачи)
Декларативная реализация целостности
CREATE TABLE Publications
(
isbn VARCHAR(14) NOT NULL PRIMARY KEY, title VARCHAR(120) NOT NULL,
author VARCHAR(30) NULL,
public_year INT DEFAULT YEAR(GETDATE()) CHECK(public_year >= YEAR(GETDATE()) -100 AND public_year <= YEAR(GETDATE())),
pages INT CHECK(pages >= 5 AND pages <= 2000) );
Декларативная реализация целостности
CREATE TABLE Exemplars
(
inv VARCHAR(10) NOT NULL PRIMARY KEY,
isbn VARCHAR(14) NOT NULL
FOREIGN KEY REFERENCES Publications(isbn),
reader_id INT NULL, /* нужна ссылка на Readers, но еще нет такой таблицы*/
date_out DATETIME
)
Декларативная реализация целостности
CREATE TABLE Readers
(
reader_id INT NOT NULL PRIMARY KEY IDENTITY,
last_name VARCHAR(50) NOT NULL, first_name VARCHAR(50) NOT NULL, second_name VARCHAR(50) NULL, work_phone CHAR(11),
home_phone CHAR(11),
CONSTRAINT CK_phone CHECK(work_phone IS NOT NULL OR home_phone IS NOT NULL)
)
/* Установление ссылки */
ALTER TABLE dbo.Exemplars
ADD CONSTRAINT FK_Exemplars_Readers
FOREIGN KEY (reader_id) REFERENCES Readers(reader_id)