Одним из основополагающих понятий в технологии баз данных является понятие целостности. В общем случае, это понятие, прежде всего, связано с тем, что база данных отражает в информационном виде некоторый объект реального мира или совокупность взаимосвязанных объектов реального мира. В реляционной модели объекты реального мира представлены в виде совокупности взаимосвязанных отношений. Целостность базы данных – это правила и средства, обеспечивающие надежную реализацию установленных межтабличных связей между всеми данными, содержащимися в базе. Поддержание целостности данных является достаточно серьезным и сложным вопросом. При эксплуатации базы данных ее повреждение может возникнуть по нескольким причинам: при сбое компьютера, вследствие ошибок в программном обеспечении, из-за некорректных действий пользователя.

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

Поддержка целостности в реляционной модели данных в ее классическом понимании, включает в себя 3 аспекта.

Во-первых, это поддержка структурной целостности, которая трактуется как то, что реляционная СУБД должна допускать работу только с однородными структурами данных типа «реляционное отношение». При этом понятие «реляционного отношения» должно удовлетворять всем ограничениям, накладываемым на него в классической теории реляционной БД. Отсутствие дубликатов кортежей (строки отношений), соответственно, обязательное наличие первичного ключа (один или несколько столбцов (атрибутов), которые однозначно идентифицируют каждую запись в таблице, т.е. позволяют четко отличить одну запись от другой), отсутствие понятия упорядоченности кортежей.

В дополнение к структурной целостности необходимо рассмотреть проблему неопределенных Null значений. Неопределенное значение в реляционной базе данных интерпретируется как значение, неизвестное на данный момент времени. Это значение при появлении дополнительной информации в любой момент времени может быть заменено на некоторое конкретное значение.

Во-вторых, это поддержка языковой целостности, которая состоит в том, что реляционная СУБД должна обеспечивать языки описания и манипулирования данными не ниже стандарта SQL. Не должны быть доступны иные низкоуровневые средства манипулирования данными, не соответствующие стандарту.

Именно поэтому доступ к информации, хранимой в базе данных, и любые изменения этой информации могут быть выполнены только с использованием операторов языка SQL.

В-третьих, это поддержка ссылочной целостности (Declarative Referential Integrity, DRI), означает обеспечение одного из заданных принципов взаимосвязи между экземплярами кортежей взаимосвязанных отношений:

· кортежи подчиненного отношения уничтожаются при удалении кортежа основного отношения, связанного с ним;

· кортежи основного отношения модифицируются при удалении кортежа основного отношения, связанного с ним, при этом на месте ключа родительского отношения ставится неопределенное Null значение.

Ссылочная целостность обеспечивает поддержку непротиворечивого состояния БД в процессе модификации данных при выполнении операций добавления или удаления.

Кроме указанных ограничений целостности, которые в общем виде не определяют семантику БД, вводится понятие семантической поддержки целостности.

Структурная, языковая и ссылочная целостности определяют правила работы СУБД с реляционными структурами данных. Требования поддержки этих трех видов целостности говорят о том, что каждая СУБД должна уметь это делать, а разработчики должны это учитывать при построении БД с использованием реляционной модели. Эти три аспекта никак не касаются содержания БД. Для определения некоторых ограничений, которые связаны с содержанием БД, требуются другие методы. Именно эти методы и сведены в поддержку семантической целостности.

Семантическая поддержка может быть обеспечена двумя путями:

· декларативный, выполняемый средствами языка SQL;

· процедурный, выполняемый посредством триггеров и хранимых процедур.

Декларативный путь связан с наличием механизмов в рамках СУБД, обеспечивающих проверку и выполнение ряда декларативно заданных правил-ограничений, называемых чаще всего «бизнес-правилами» (Business Rules) или декларативными ограничениями целостности.

Выделяются следующие виды декларативных ограничений целостности:

· ограничения целостности атрибута: значение по умолчанию, задание обязательности или необязательности значений (Null), задание условий на значения атрибутов. Задание значения по умолчанию означает, что каждый раз при вводе новой строки в отношение, при отсутствии данных в указанном столбце этому атрибуту присваивается именно значение по умолчанию;

· ограничения целостности, задаваемые на уровне доменов, при поддержке доменной структуры. Эти ограничения удобны, если в БД присутствуют несколько столбцов разных отношений, которые принимают значения из одного и того же множества допустимых значений;

· ограничения целостности, задаваемые на уровне отношения. Некоторые семантические правила невозможно преобразовать в выражения, которые будут применимы только к одному столбцу;

· ограничения целостности, задаваемые на уровне связи между отношениями: задание обязательности связи, принципов каскадного удаления (при удалении записи в главной таблице обеспечивает удаление всех связанных записей в подчиненной таблице) и каскадного изменения данных (при изменении значения ключевого поля в главной таблице обеспечивает обновление всех связанных записей в подчиненной таблице), задание поддержки ограничений по мощности связи. Эти виды ограничений могут быть выражены заданием обязательности или необязательности значений внешних ключей (одного или нескольких полей в таблице, которые содержат ссылку на поле (поля) первичного ключа в другой таблице во взаимосвязанных отношениях).

Концептуальные и физические ER-модели

Разработанный выше пример ER-диаграммы является примером концептуальной диаграммы. Это означает, что диаграмма не учитывает особенности конкретной СУБД. По данной концептуальной диаграмме можно построить физическую диаграмму, которая уже будут учитываться такие особенности СУБД, как допустимые типы и наименования полей и таблиц, ограничения целостности и т.п.

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

Мы отметили, что только существенные или значимые изменения предметной области должны отслеживаться в информационной модели. Действительно, модель всегда представляет собой некоторое упрощение реального объекта, в модели мы отражаем только то, что нам важно для решения конкретного набора задач. И в модели данных должны быть предусмотрены средства и методы, которые позволят нам обеспечивать динамическое отслеживание в базе данных согласованных действий, связанных с согласованным изменением информации. Именно этим вопросам и посвящена данная лекция.

Целостность базы данных - свойство базы данных, означающее, что БД содержит полную и непротиворечивую информацию, необходимую для корректного функционирования приложений. Для обеспечения целостности накладывают ограничения целостности.

Це́лостность ба́зы да́нных (database integrity) - соответствие имеющейся в базе данных информации её внутренней логике, структуре и всем явно заданным правилам. Каждое правило, налагающее некоторое ограничение на возможное состояние базы данных, называется ограничением целостности (integrity constraint). Примеры правил: вес детали должен быть положительным; количество знаков в телефонном номере не должно превышать 25; возраст родителей не может быть меньше возраста их ребёнка и т.д.

Задача аналитика и проектировщика базы данных - возможно более полно выявить все имеющиеся ограничения целостности и задать их в базе данных.



Целостность БД не гарантирует достоверности содержащейся в ней информации, но обеспечивает по крайней мере правдоподобность этой информации, отвергая заведомо невероятные, невозможные значения. Таким образом, не следует путать целостность БД с достоверностью БД. Достоверность (или истинность) есть соответствие фактов, хранящихся в базе данных, реальному миру. Очевидно, что для определения достоверности БД требуется обладание полными знаниями как о содержимом БД, так и о реальном мире. Для определения целостности БД требуется лишь обладание знаниями о содержимом БД и о заданных для неё правилах. Поэтому СУБД может (и должна) контролировать целостность БД, но принципиально не в состоянии контролировать достоверность БД. Контроль достоверности БД может быть возложен только на человека, да и то в ограниченных масштабах, поскольку в ряде случаев люди тоже не обладают полнотой знаний о реальном мире.

Итак, БД может быть целостной, но не достоверной. Возможно и обратное: БД может быть достоверной, но не целостной. Последнее имеет место, если правила (ограничения целостности) заданы неверно.

Целостность (от англ. integrity – нетронутость, неприкосновенность, сохранность, целостность) – понимается как правильность данных в любой момент времени. Но эта цель может быть достигнута лишь в определенных пределах: СУБД не может контролировать правильность каждого отдельного значения, вводимого в базу данных (хотя каждое значение можно проверить на правдоподобность). Например, нельзя обнаружить, что вводимое значение 5 (представляющее номер дня недели) в действительности должно быть равно 3. С другой стороны, значение 9 явно будет ошибочным и СУБД должна его отвергнуть. Однако для этого ей следует сообщить, что номера дней недели должны принадлежать набору (1,2,3,4,5,6,7).

Поддержание целостности базы данных может рассматриваться как защита данных от неверных изменений или разрушений (не путать с незаконными изменениями и разрушениями, являющимися проблемой безопасности). Современные СУБД имеют ряд средств для обеспечения поддержания целостности (так же, как и средств обеспечения поддержания безопасности).

Выделяют три группы правил целостности:

- Целостность по сущностям. Не допускается, чтобы какой-либо атрибут, участвующий в первичном ключе, принимал неопределенное значение. (Например: Каждый сотрудник имеет уникальный табельный номер)

- Целостность по ссылкам . Значение внешнего ключа должно либо: быть равным значению первичного ключа цели; быть полностью неопределенным, т.е. каждое значение атрибута, участвующего во внешнем ключе должно быть неопределенным. (Например: Сотрудник обязан числиться в одном отделе)

- Целостность, определяемая пользователем. Для любой конкретной базы данных существует ряд дополнительных специфических правил, которые относятся к ней одной и определяются разработчиком. Чаще всего контролируется:

1. уникальность тех или иных атрибутов,

2. диапазон значений (экзаменационная оценка от 2 до 5),

3. принадлежность набору значений (пол "М" или "Ж").

Ограничение представляет собой правило, которому должны подчиняться данные, вводимые пользователями в определенный столбец или группу столбцов. Ограничение является частью определения таблицы. Их можно накладывать при создании таблицы или же добавлять позднее. Можно удалять ранее наложенные ограничения, не оказывая при этом никакого влияния на данные, хранящиеся в таблице. Кроме того, можно временно приостановить действие ограничений.

Различие между ограничениями уровня таблицы и уровня столбца состоит в том, что последние применяются не ко всей таблице, а только к одному ее столбцу. Поэтому их можно вводить как часть определения столбца. Однако если необходимо ввести ограничение не для одного, а для нескольких столбцов сразу (например, в случае применения ограничения первичного ключа, если этот ключ состоит из двух столбцов), то необходимо сначала определить эти столбцы в таблице, а затем добавить определение этого ограничения в завершающей части определения таблицы. Получится ограничение уровня таблицы. На практике вам не придется задумываться о том, к какому уровню будет отнесено ограничение, поскольку в обоих случаях используется одинаковый синтаксис.

Виды ограничений

Разные виды ограничений соответствуют различным видам целостности, поэтому полезно взглянуть на ограничения с точки зрения поддерживаемых ими видов целостности.

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

Целостность сущностей описывается совокупностью ограничений которые должны выполняться для любых отношений в любых реляционных базах данных. Теоретики баз данных формулируют эти ограничения по-разному. Например, в называют «Условиями целостности … будем называть особые, отдельно хранящиеся данные, которыми на концептуальном уровне … представлено … правило (закон, критерий) принадлежности кортежей отношению, представленному этими данными (записями) в базе данных. К уровням целостности базы данных, как правило, присоединяются также спецификации условий принадлежности значений каждого из атрибутов реляционной таблицы к соответствующему ему домену в базе данных».

Из данного определения можем извлечь следующие простые формулировки ограничений:

1. Все строки таблицы должны иметь одинаковую структуру, одно и то же количество атрибутов.

2. Никакие две записи не могут совпадать. Если определен первичный ключ отношения, то каждая строка таблицы должна иметь свое значение первичного ключа.

3. Значения атрибутов должны быть атомарными.

4. Значения каждого атрибута должны быть взяты из некоторого фиксированного множества значений (домена).

Первое ограничение фиксирующее, что единственной структурой данных, используемых в реляционных БД, является отношение, по сути определяет само понятие отношения (таблица). Следствием второго ограничения является обязательное наличие атрибута, объявленного первичным ключом, обеспечивающим уникальность записей. Третье – не является строгим, т.е. результат невыполнения этого ограничения не обязательно скажется на целостности, но вероятность ошибок велика.



В ограничения целостности сущностей заключаются в требовании уникальности кортежей отношения (записей таблицы), из которого вытекают следующие ограничения:

1. отсутствие кортежей-дубликатов (данное требование предъявляется лишь к атрибутам первичных ключей);

2. отсутствие атрибутов с множественным характером значений.

1. Найти соответствие условий целостности из условиям, названным выше, (1 – 4).

2. Составить перечень атрибутов для сведений об адресе отношения СОТРУДНИК, обеспечивающих атомарность.

Ограничения целостности ссылок заключаются в том, что для любой записи с конкретным значением внешнего ключа должна обязательно существовать запись связанной таблицы-отношения с соответствующим значением первичного ключа.

Пример 1. Рассмотрим отношение СОТРУДНИКИ с внешним ключом «Код отдела» и связано с отношением ОТДЕЛЫ с первичным ключом «Код отдела» (см. рис. 8). Если существует сотрудник Волков И. И., работающий в отделе О1, то соответствующий отдел должен существовать и данные о нем должны храниться в таблице ОТДЕЛЫ .

Отношение Сотрудники

Отношение Отделы

Пример 2. Связь между таблицами Студент и Сдал осуществляется по полю НОМЕР_Зачетки, это связь типа один-ко-многим (1:М). Причем главной является таблица Студент, а подчиненной - таблица Сдал, т.к. в ней возможно любое количество записей со значением в поле НОМЕР_Зачетки, которое в таблице Студент может быть только один раз. Поле связи должно быть обязательно первичным ключом главной таблицы. Главную таблицу иногда называют родительской, а подчиненную - дочерней.

Поля связи в связываемых таблицах не обязательно должны иметь одинаковые имена, но значения полей должны быть взяты из одного и того же множества. Возможно использование для связи не только одного поля, но и совокупности полей.

Большинство СУБД реляционного типа, но не все, осуществляют контроль ссылочной целостности данных. Контроль данных на непротиворечивость осуществляется СУБД автоматически в следующих случаях:

1)При добавлении данных в подчиненную таблицу. Нельзя добавить строку, в которой поле связи содержит значение, отсутствующее в главной таблице. При добавлении данных в главную таблицу контроль ссылочной целостности не требуется.

2)При удалении данных из главной таблицы. Из главной таблицы запрещается удалять строку, если в подчиненной таблице есть строки, связанные с ней. Альтернативным способом решения проблемы сохранения ссылочной целостности данных при удалении является каскадное удаление, то есть удаление строки из главной таблицы с одновременным удалением соответствующих ей строк из подчиненной.

3)При модификации значения поля связи, как в главной, так и в подчиненной таблице. В подчиненной таблице значение поля связи можно изменить на другое значение, но только в случае, если новое значение есть в главной таблице. Изменить значение поля связи главной таблицы нельзя или следует произвести соответствующую замену и во всех строках подчиненной таблице, то есть выполнить каскадное изменение данных. Изменение в таблицах значений полей, не участвующих в связи контроля ссылочной целостности не требует.

Задания для самостоятельной работы

1. Добавить в таблицу СОТРУДНИКИ запись о Фроловой О.А., работающей в отделе кадров. Изобразить отношения СОТРУДНИКИ и ОТДЕЛЫ.

2. Удалить из таблицы ОТДЕЛЫ запись со значением атрибута Краткое_наим_отдела «ЛИД». Изобразить отношения СОТРУДНИКИ и ОТДЕЛЫ.

Замечания

1 Основное внимание в ограничениях целостности в иерархической модели уделяется целостности ссылок между предками и потомками с учетом основного правила: никакой потомок не может существовать без родителя.

2 В сетевой модели данных ослаблен контроль целостности связей из-за допустимости установления произвольных связей между записями.

Все операции над базой данных сводятся к манипуляциям с записями и полями таблиц. Обращаясь к нашему студенческому архиву (см. Таб.1), возможно, захочется узнать, кто из студентов учится в группе 407 – ответ: Сидоров (запись 3) и Соловьев (запись 4). Другой пример: кто среди студентов самый старший – ответ: Петров (запись 2). Это примеры простейших операций выборки.

Манипуляционная часть описывает два эквивалентных способа манипулирования реляционными данными - реляционную алгебру и реляционное счисление .

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

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

Набор операций, предложенный Коддом, содержит восемь операций:

1)теоретико-множественные операции, такие как объединение, пересечение, разность и декартово произведение, а ко второму - селекция, проекция, соединение и деление

2)специальные реляционные операции, к которым относятся операция присваивания, позволяющая сохранить в БД результат вычисления алгебраических выражений, и операция переименования атрибутов, которая дает возможность корректно сформировать заголовок результирующего отношения - его схему.

Пример 1. Объединение. R3 = R1 È R2

Пусть отношение R1 - это таблица «Абитуриенты - победители олимпиады», а R2 - таблица «Абитуриенты, прошедшие по конкурсу на основании экзаменов».

Таблица Абитуриенты - победители олимпиады.

Таблица Абитуриенты, прошедшие по конкурсу на основании экзаменов.

Пусть основанием для зачисления в университет является победа в олимпиаде, либо успешная сдача вступительных экзаменов. Результат объединения (R3), который мы назовем «Абитуриенты, зачисленные в университет», включает все строки первой таблицы и недостающие строки из второй.

Таблица Абитуриенты, зачисленные в университет.

Пример 2. Пересечение. R3 = R1 Ç R2

Исходные данные те же, что и в случае объединения. Результат пересечения включает только те строки первой таблицы, которые есть во второй. В нашем случае результатом будет таблица, которую можно назвать «Абитуриенты, зачисленные в университет по двум показателям».

Таблица Абитуриенты, зачисленные в университет по двум показателям.

В теории множеств операции объединения, пересечения и разности имеют смысл для любых двух множеств. В случае реляционной алгебры это не так. Результатом любой из этих операций должно стать отношение, то есть множество однотипных строк, следовательно, операндами должны быть отношения с одинаковыми, а точнее совместимыми, схемами. Это означает, что отношения должны иметь одинаковую степень и одинаковые типы соответствующих атрибутов. Имена атрибутов могут отличаться, тогда после переименования можно выполнить основную операцию, то есть объединение, пересечение или разность.

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

При нарушениях условий целостности возможно возникновение аномалий. Существует несколько видов аномалий: избыточности, обновления, включения, удаления.

Основная задача при проектировании реляционных БД -формирование оптимальных отношений.

Пример 1. Рассмотрим БД «Объединение кооперативов». В отношении ПОСТАВЩИКИ (НАЗВАНИЕ ПОСТАВЩИКА, АДРЕС ПОСТАВЩИКА, ТОВАР, ЦЕНА), в связи с такой его схемой, могут возникают следующие проблемы:

1. Аномалия избыточность: адрес поставщика повторяется для каждого повторяемого товара.

2. Аномалия обновления (потенциальная противоречивость, может и не возникнуть): вследствие избыточности можно обновить адрес поставщика в одном кортеже, оставив его неизменным в другом. При этом может оказаться, что для некоторых поставщиков нет единого адреса.

3. Аномалия удаления: при необходимости удаления всех товаров, поставляемых данным поставщиком, непреднамеренно можно утратить его адрес.

4. Аномалия включения: в БД может быть записан адрес поставщика, который в настоящее время не поставляет товар, можно поместить неопределенные значения атрибутов ТОВАР и ЦЕНА. Но если он начнет поставлять некоторый товар, можно забыть удалить кортеж с неопределенными значениями. ТОВАР и НАЗВАНИЕ ТОВАРА образуют ключ данного отношения, а поиск кортежей с неопределенными значениями может быть затруднен или невозможен.

Избыточность в данных потенциально приводит к различным аномалиям и нарушениям целостности данных. Аномалия это то, что не является нормой и в связи с этим считается странностью и исключением. Логически таблица БД построена, вроде бы, правильно, но возникает ошибка, которая может повлечь нарушение всей структуры БД. Т.к. аномалии проявляют себя при выполнении операций, изменяющих состояние базы данных, то различают следующие виды аномалий:

· Аномалии вставки (INSERT)

· Аномалии обновления (UPDATE)

· Аномалии удаления (DELETE)

Пример 2: Рассмотрим в качестве предметной области некоторую организацию, выполняющую некоторые проекты. В текущий момент состояние предметной области отражается следующими фактами:

· Сотрудник Иванов, работающий в 1 отделе, выполняет в первом проекте "Космос" задание 1 и во втором проекте "Климат" задание 1.

· Сотрудник Петров, работающий в 1 отделе, выполняет в первом проекте "Космос" задание 2.

· Сотрудник Сидоров, работающий во 2 отделе, выполняет в первом проекте "Космос" задание 3 и во втором проекте "Климат" задание 2.

Это состояние отражается в таблице СОТРУДНИКИ_ОТДЕЛЫ_ПРОЕКТЫ (курсивом выделены ключевые поля):

Аномалии вставки (INSERT)

В таблицу СОТРУДНИКИ_ОТДЕЛЫ_ПРОЕКТЫ нельзя вставить данные о сотруднике, который пока не участвует ни в одном проекте. Действительно, если, например, во втором отделе появляется новый сотрудник, скажем, Королев, и он пока не участвует ни в одном проекте, то мы должны вставить запись (4, Королев, 2, 33-22-11, null, null, null). Это сделать невозможно, т.к. поле №Проекта входит в состав потенциального ключа, и, следовательно, не может содержать null-значений.

Точно также нельзя вставить данные о проекте, над которым пока не работает ни один сотрудник.

Причина аномалии - хранение в одном отношении разнородной информации (и о сотрудниках, и о проектах, и о работах по проекту).

Вывод - логическая модель данных неадекватна модели предметной области. База данных, основанная на такой модели, будет работать неправильно.

Термин «целостность» используется для описания точности и корректности (или непротиворечивости) данных, хранящихся в базе данных.

Если термин « » означает защиту данных от несанкционированного доступа, то «целостность» означает защиту от санкционированного доступа, т.е. целостность возникает тогда, когда у пользователя имеются права работы с базой данных, но при этом он работает корректно (не вводит каких-то данных, которые приводят базу данных в неправильное положение).

Ограничения целостности могут быть любой степени сложности. В ряде случаев дополнительные разные ограничения называют бизнес-правилами. Когда речь идет об элементарных ограничениях, то здесь используется ключевое слово CHECK (контроль правильности ввода данных, соответствия этих данных другим…), их называют элементарными, они чаще всего бывают жестко вписаны. Расширенные правила могут включать вопросы целостности между отдельными таблицами, например, «нет детей без родителей». А бизнес-правила могут касаться конкретных сфер применения баз данных (например, у бухгалтерской базы данных свои, у другой другие …). При этом сами ограничения могут быть установлены на сервере, на клиенте или на промежуточных программных средствах (middleware).

А) Рассмотрим вариант «на сервере », т.е. ограничения размещают в виде кода на сервере. В этом случае данные самостоятельно защищаются от вмешательства и случайного стирания, и все клиенты автоматически подчиняются этим ограничениям. Это приводит к тому, что сами клиентские приложения могут быть более простыми, поскольку в них уже не надо закладывать ограничений. Во-вторых, выполнение ограничений на сервере быстрее, т.к. их не надо высылать на сервер, а надо только прислать ошибку. Однако есть определенные проблемы, связанные с тем, что язык SQL не так хорош, по сравнению с универсальными языками, и там не так просто хитрые ограничения сделать. По своей сути ограничения хранятся в системных таблицах базы данных, у них обычно имеются либо автоматически создаваемые, либо создаваемые пользователем имена (последний вариант лучше, т.к. если автоматически, то идут номера, в которых трудно найти нужное ограничение). В InterBase автоматически они называются integer _№. К недостаткам также можно отнести невозможность клиентского приложения реагировать на некоторые ошибочные ситуации (Например, проблемы с сетью).

Б) При размещении ограничений на клиенте, ввиду универсальных языков с богатыми библиотеками и возможностями, можно создавать очень сложные и гибкие ограничения. Можно встраивать ограничения в визуальные компоненты, создавать новые классы, содержащие эти ограничения и т.д. Но это приводит к тому, что такого рода ограничения надо распространять на разные клиентские приложения, выполняющие разную роль, во-вторых, это требует более мощных клиентских станций, что нарушает философию клиент-серверных систем (когда сервер должен быть мощным, а клиент – простеньким), и в таких случаях трудно просмотреть все ограничения, поскольку они разбросаны по разным станциям. К недостаткам такого рода удобных и гибких возможностей можно отнести то, что в разных языках такого рода ограничения выполняются по-разному, и стандартов на создание таких ограничений нет, поэтому многое зависит от знаний и умений программиста, использующего данный язык программирования. Чем больше квалификация, тем хитрее ограничение он может написать. С базами данных проще, там язык более или менее стандартный, поэтому понять суть ограничения может любой, кто знает этот язык.

В) Размещение ограничений на уровне промежуточных средств. К промежуточным средствам относятся такие системы как ODBC, GDBC, различные API, которые предоставляют унифицированный доступ к базам данных (OLE DB…). Здесь тоже есть определенные плюсы и минусы. Минусы прежде всего связаны с тем, что, несмотря на то, что таких API стало много, тем не менее достаточно сильно развитых средств создания ограничений мало, во-вторых, все эти API обычно привязаны к операционной системе (базы данных как правило делают так, чтоб они и там, и там могли работать, а вот эти промежуточные средства – обычно принадлежность либо UNIX, либо Windows, либо еще чего-нибудь).

Типы (виды) условий целостности данных:

1. обязательность данных – как только вы войдете в набор данных того или иного поля, пока не введете какие-либо данные, вас система из средства набора не выпустит (NOT NULL).
2. проверка на правильность (validity checking)– проверка диапазона значений (правильность введения даты, размера чисел)
3. целостность (entity integrity) – соответствие внешнего ключа и primary key
4. ссылочная целостность (referent integrity) – как правило, проверяют в двух местах: на клиенте, на сервере.
5. непротиворечивость (business правила) – деловые правила, зависит от конкретных СУБД.

Реализация деловых правил в прикладной программе (на стороне клиента) имеет ряд недостатков:
— дублирование – если есть какие-то ограничения и несколько приложений, то нужно не забыть зайти в код каждого приложения и сделать там соответствующее ограничение.
— недостаточная согласованность – большие системы пишут разные программисты и могут по разному реализовать одни и те же ограничения, которые в результате работают по разному (с разной скоростью и т.п.) не согласованно.
— трудность сопровождения – системы не бывают статичны, их часто доделывают и переделывают в соответствии с внешними изменениями, приходится забираться в код программы и вносить изменения.
— сложность – большое число различных бизнес правил, поэтому всякое, даже простое обновление таблицы, например, приводит к длительному процессу, т.к. нужно делать много проверок.

В 1986 году фирма «say base» ввело понятие «триггера», что позволило включить (перенести) написание деловых правил на сервер и, следовательно, уменьшить объем прикладных программ.

Недостатки триггеров:
— сложность базы данных, когда деловые правила становятся частью базы данных,
— скрытость правил — логика срабатывания триггеров бывает не всегда понятной, особенно для программистов, которые приходят на модернизацию программы, т.е. приходится разбираться в чужой программе и логике, что трудно. Это иногда называют скрытыми правилами.

Одним из основополагающих понятий в технологии баз данных является понятие целостности. В общем случае, это понятие, прежде всего, связано с тем, что база данных отражает в информационном виде некоторый объект реального мира или совокупность взаимосвязанных объектов реального мира. В реляционной модели объекты реального мира представлены в виде совокупности взаимосвязанных отношений. Целостность базы данных – это правила и средства, обеспечивающие надежную реализацию установленных межтабличных связей между всеми данными, содержащимися в базе. Поддержание целостности данных является достаточно серьезным и сложным вопросом. При эксплуатации базы данных ее повреждение может возникнуть по нескольким причинам: при сбое компьютера, вследствие ошибок в программном обеспечении, из-за некорректных действий пользователя.

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

Поддержка целостности в реляционной модели данных в ее классическом понимании, включает в себя 3 аспекта.

Во-первых, это поддержка структурной целостности, которая трактуется как то, что реляционная СУБД должна допускать работу только с однородными структурами данных типа «реляционное отношение». При этом понятие «реляционного отношения» должно удовлетворять всем ограничениям, накладываемым на него в классической теории реляционной БД. Отсутствие дубликатов кортежей (строки отношений), соответственно, обязательное наличие первичного ключа (один или несколько столбцов (атрибутов), которые однозначно идентифицируют каждую запись в таблице, т.е. позволяют четко отличить одну запись от другой), отсутствие понятия упорядоченности кортежей.

В дополнение к структурной целостности необходимо рассмотреть проблему неопределенных Null значений. Неопределенное значение в реляционной базе данных интерпретируется как значение, неизвестное на данный момент времени. Это значение при появлении дополнительной информации в любой момент времени может быть заменено на некоторое конкретное значение.

Во-вторых, это поддержка языковой целостности, которая состоит в том, что реляционная СУБД должна обеспечивать языки описания и манипулирования данными не ниже стандарта SQL. Не должны быть доступны иные низкоуровневые средства манипулирования данными, не соответствующие стандарту.

Именно поэтому доступ к информации, хранимой в базе данных, и любые изменения этой информации могут быть выполнены только с использованием операторов языка SQL.

В-третьих, это поддержка ссылочной целостности (Declarative Referential Integrity, DRI), означает обеспечение одного из заданных принципов взаимосвязи между экземплярами кортежей взаимосвязанных отношений:

    кортежи подчиненного отношения уничтожаются при удалении кортежа основного отношения, связанного с ним;

    кортежи основного отношения модифицируются при удалении кортежа основного отношения, связанного с ним, при этом на месте ключа родительского отношения ставится неопределенное Null значение.

Ссылочная целостность обеспечивает поддержку непротиворечивого состояния БД в процессе модификации данных при выполнении операций добавления или удаления.

Кроме указанных ограничений целостности, которые в общем виде не определяют семантику БД, вводится понятие семантической поддержки целостности.

Структурная, языковая и ссылочная целостности определяют правила работы СУБД с реляционными структурами данных. Требования поддержки этих трех видов целостности говорят о том, что каждая СУБД должна уметь это делать, а разработчики должны это учитывать при построении БД с использованием реляционной модели. Эти три аспекта никак не касаются содержания БД. Для определения некоторых ограничений, которые связаны с содержанием БД, требуются другие методы. Именно эти методы и сведены в поддержку семантической целостности.

Семантическая поддержка может быть обеспечена двумя путями:

    декларативный, выполняемый средствами языка SQL;

    процедурный, выполняемый посредством триггеров и хранимых процедур.

Декларативный путь связан с наличием механизмов в рамках СУБД, обеспечивающих проверку и выполнение ряда декларативно заданных правил-ограничений, называемых чаще всего «бизнес-правилами» (Business Rules) или декларативными ограничениями целостности.

Выделяются следующие виды декларативных ограничений целостности:

    ограничения целостности атрибута: значение по умолчанию, задание обязательности или необязательности значений (Null), задание условий на значения атрибутов. Задание значения по умолчанию означает, что каждый раз при вводе новой строки в отношение, при отсутствии данных в указанном столбце этому атрибуту присваивается именно значение по умолчанию;

    ограничения целостности, задаваемые на уровне доменов, при поддержке доменной структуры. Эти ограничения удобны, если в БД присутствуют несколько столбцов разных отношений, которые принимают значения из одного и того же множества допустимых значений;

    ограничения целостности, задаваемые на уровне отношения. Некоторые семантические правила невозможно преобразовать в выражения, которые будут применимы только к одному столбцу;

    ограничения целостности, задаваемые на уровне связи между отношениями: задание обязательности связи, принципов каскадного удаления (при удалении записи в главной таблице обеспечивает удаление всех связанных записей в подчиненной таблице) и каскадного изменения данных (при изменении значения ключевого поля в главной таблице обеспечивает обновление всех связанных записей в подчиненной таблице), задание поддержки ограничений по мощности связи. Эти виды ограничений могут быть выражены заданием обязательности или необязательности значений внешних ключей (одного или нескольких полей в таблице, которые содержат ссылку на поле (поля) первичного ключа в другой таблице во взаимосвязанных отношениях).

Целостность данных в Access

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

    связанное поле главной таблицы является ключевым полем или имеет уникальный индекс;

    связанные поля имеют один тип данных;

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

Для соблюдения этих правил в Access отслеживаются и блокируются следующие действия:

    нельзя ввести в поле внешнего ключа связанной таблицы значение, не содержащееся в ключевом поле главной таблицы. Однако в поле внешнего ключа возможен ввод значений Null, показывающих, что записи не являются связанными. Например, нельзя сохранить запись, регистрирующую книгу, написанную несуществующим автором, но можно создать запись для книги, которая пока не отнесена ни к одному из авторов, если ввести значение Null в ключевое поле id_aвтopa;

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

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