Диго С.М. Базы данных проектирование и использование (1084447), страница 34
Текст из файла (страница 34)
Как правило, вставка зависимой записи при наличии идентифицирующей связи не может быть проведена, если отсутствует соответствующая ей запись в главной таблице (ситуация, когда в главной таблице нет записи со значением ключа, равным введенному значению поля связи), т.е. используется режим RESTRICT. Можно представить себе такую организацию ведения таблиц базы данных, когда в основную таблицу при вводе зависимой записи автоматически вводится новая запись с ключом, соответствующим значению поля связи зависимой записи. Но такой возможностью не нужно злоупотреблять, так как отсутствующее значение может быть вызвано ошибкой при вводе данных, а не отсутствием информации в базе данных. Режим NONE при вставке зависимой записи при наличии идентифицирующей связи использовать не следует. Если в предметной области возникает необходимость вставить зависимый объект, не связанный с основным объектом (т.е. класс членства объекта в связи — необязательный), то для связи таких объектов следует выбрать неидентифицирующую связь.
Так называемая категориальная связь является особой связью: с одной стороны, она является идентифицирующей связью, а с другой - связывает не два разных объекта, а информацию об одном и том же объекте. Для обобщенного объекта хорошо бы иметь специальный инструмент, который позволял бы рассматривать его как единое целое. В ERWin можно задавать ограничения целостности только для каждой отдельной связи, соединяющей родовой объект с каждым из видовых объектов.
4.3.3. Триггер ссылочной целостности
Для обеспечения ссылочной целостности может быть создан особый вид триггера - триггер ссылочной целостности. По умолчанию ERWin генерирует триггеры, обеспечивающие контроль ссылочной целостности для каждой связи, определенной в ER-модели.
При генерации триггеров ERWin использует механизм шаблонов -специальных скриптов, использующих макрокоманды.
Шаблоны триггеров ссылочной целостности, используемые ERWin, можно изменять, причем можно переопределить как триггеры для конкретной связи, так и шаблоны для всей модели в целом.
Для редактирования триггера следует (находясь в физической модели) щелкнуть правой кнопкой мыши по таблице и выбрать во всплывающем меню пункт [название целевой СУБД] Trigger (рис. 4.4).
Рис. 4.4. Позиция меню для редактирования триггера
Поскольку не все СУБД поддерживают механизм триггеров, то соответствующая позиция меню активна не всегда: она не активна для настольных СУБД и активна для корпоративных систем.
На это следует обратить внимание
-
Обеспечение целостности базы данных является важнейшей задачей при проектировании и эксплуатации БД.
-
При проектировании БД необходимо выявить все ограничения целостности, которые обусловлены как особенностями предметной области, так и спецификой используемого программного и технического обеспечения.
-
Из общего списка ограничений целостности необходимо выявить те, которые будут контролироваться в данной ИС, и определить механизм их реализации.
Контрольные вопросы
1. Что такое «ограничения целостности»?
2. В чем важность задания ограничений целостности?
3. Какие виды ограничений целостности вы знаете? Приведите примеры ограничений целостности каждого вида.
4. Какие способы задания ограничений целостности вы знаете? В чем преимущества и недостатки каждого из них?
5. В чем суть применения триггеров для контроля целостности данных?
6. В какой момент происходит проверка соблюдения ограничения целостности, относящегося к полю? ограничения, задающего отношение между значениями разных полей одной записи? отложенных ограничений целостности?
7. Что такое ограничение целостности связи?
8. Если задано ограничение целостности связи, но не задано каскадное удаление связанных записей, повлияет ли заданное ограничение целостности на процесс удаления записи из основного файла?
9. Если задано ограничение целостности связи, может ли значение внешнего ключа быть пустым?
10. В чем суть ограничения целостности по существованию? В чем его отличие от ограничения целостности связи?
11. Какие виды диапазонов вы знаете? В чем особенности их задания?
12. Что такое «домен»? Как можно реализовывать ограничения целостности на «домен»?
13. Что такое «транзакция»? С каким видом ограничений целостности обычно связаны транзакции?
14. Какие ограничения связи непосредственно отображены в ER-модели?
15. Какие ограничения целостности и каким образом могут быть заданы в ERWin?
Глава 5 СОЗДАНИЕ И ВЕДЕНИЕ БАЗ ДАННЫХ
5.1. Описание структуры баз данных.
Общие сведения
Спроектированная структура базы данных должна быть описана на языке описания данных или с использованием соответствующих операторов интегрированного языка. Язык описания данных может быть различным: аналитическим, табличным, смешанным. Описания данных могут храниться отдельно от данных или вместе с ними. В СУБД предшествующего поколения (к которым относятся иерархические и сетевые системы) обычно использовалось раздельное хранение данных и их описаний. В большинстве современных настольных реляционных СУБД описания БД хранятся вместе с данными.
В связи с тем, что наибольшее развитие в настоящее время имеют реляционные СУБД, рассмотрим вопросы создания БД на их примере.
Для описания логической структуры данных в настольных реляционных СУБД обычно используется простой табличный язык описания данных, физические параметры практически не указываются. Загрузка данных в базу данных заключается либо во вводе данных с клавиатуры, либо в переносе их из других файлов. Наблюдается упрощение технологического процесса, связанного с созданием баз данных.
Наиболее часто используемым способом создания файла/таблицы базы данных является выбор из соответствующего меню позиции «создать новый файл базы данных/таблицу». Возможно и использование соответствующего оператора языка описания данных. В тех системах, в которых наряду с понятием «файл базы данных/таблица» поддерживается и понятие «база данных», нужно сначала определить базу данных, а затем - таблицы, входящие в нее.
Как указывалось выше, обычно описание структуры таблиц само представляется в табличной форме. Каждая строка этой таблицы описания соответствует одному полю таблицы. Каждое поле должно иметь уникальное имя в пределах таблицы. Максимальная длина этого имени и символы, допустимые при его задании, зависят от используемой операционной среды и СУБД.
Каждое поле имеет определенный тип (Field Type). Современные СУБД обычно позволяют при описании поля просмотреть список допустимых типов полей и выбрать нужный. Кроме того, во многих СУБД задать нужный тип поля можно, указав первую букву названия выбираемого типа.
Допустимые типы полей различаются от системы к системе. Наблюдается тенденция к расширению списка поддерживаемых типов данных. Многие современные СУБД наряду с традиционными типами полей (Character - символьное, Numeric - числовое, Floating - с плавающей запятой, Date - дата, Logical - логическое, Memo - поле памяти) поддерживают и такие экзотические до недавнего времени типы полей, как двоичные, рисунки и др. Наиболее развитые системы (например, Огас1е7) позволяют в единой базе данных интегрирование хранить не только структурированные данные, но и неструктурированные, такие, как поточная аудио- и видеоинформация, пространственные многомерные данные.
Для массовых применений наиболее часто используются типы Character, Numeric, Logical и Date. Тип поля Floating в основном применяется для математических расчетов, тип Memo - для хранения данных, длина которых резко отличается от записи к записи, а также при хранении длинных полей. Этот тип поля называют также полем примечания, а иногда и просто текстовым.
После указания типа поля обычно указывается его длина. Для некоторых типов полей длина предопределена и устанавливается системой автоматически. Так, например, для полей типа даты автоматически устанавливается длина, равная 8 символам, для логического типа - 1 символу. Для других типов полей проектировщик при описании файла должен задать длину поля. В некоторых случаях эта величина может быть составной. Так, например, если это поле типа Numeric, то указывается общая длина поля, включая десятичную точку и знаки после нее, а также задается число знаков после десятичной точки.
Для некоторых типов полей, например для поля типа Мемо, в качестве длины иногда указывается длина не собственно этого поля, а длина указателя, который будет храниться в записи реляционной БД и указывать на соответствующий блок в отдельном текстовом файле. Последний автоматически создается системой для хранения Мемо-полей (как это реализовано в dBase) или не указывается вообще (как в Access).
Многие реляционные системы позволяют при описании структуры файла БД указать и признаки индексирования по отдельным полям или по совокупности полей (составной индекс). Соответствующие колонки таблицы описания структуры файла БД/таблицы в разных системах называются по-разному (Index, Tag). В некоторых СУБД (например, Access) индексирование задается как свойство поля.
Индексация представляет собой способ логической упорядоченности файлов. Если при создании файла для какого-то поля в графе индексирования установлено значение «да», то для этого поля создается специальный индексный файл, который содержит значения этого поля и номер записи в индексируемом файле, содержащей такое значение поля. Индексный файл является упорядоченным (обычно организован как двоичное дерево сортировки). Многие системы позволяют также при описании файла указывать и вид упорядочения (по возрастанию, по убыванию).
Если значение «да» в графе признака индексации установлено для нескольких полей, то для каждого из них создается аналогичный файл (в зависимости от реализации хранения индексов в конкретных СУБД все эти индексные файлы могут объединяться в один мультииндексный файл или храниться как самостоятельные отдельные файлы).
Кроме индексации по одному полю можно проводить индексацию по совокупности полей (составной индекс) или по более сложному выражению. Нужно быть внимательными при задании индексации по сложному выражению, в котором участвуют поля разных типов, поскольку некоторые СУБД самостоятельно проводят необходимые преобразования типов, а некоторые - нет (при этом в лучшем случае может быть выдано предупреждающее сообщение, а в худшем - можно получить не тот результат, на который рассчитывали, и не сразу догадаться об этом).
После того как описано одно поле, переходят к описанию следующего, и так до тех пор, пока не будут определены все поля данного файла БД.
Реляционные СУБД должны поддерживать концепцию ключа. Некоторые СУБД требуют, чтобы при описании таблицы обязательно был указан ее ключ, другие - предоставляют такую возможность, но не требуют, чтобы в каждой таблице ключ был обязательно задан, третьи - вообще не предоставляют возможности идентифицировать ключ. Те системы, которые поддерживают концепцию ключа, обычно не только обеспечивают проверку на его уникальность, но и автоматически проводят индексацию по ключевому полю. (В Access, например, таблица, для которой определен ключ, так и называется индексированной.) Некоторые СУБД, например та же Access, при сохранении новой таблицы, для которой не задан ключ, предлагают определить ключ автоматически и в случае положительного ответа формируют дополнительное поле-счетчик с именем «Код», которое будет содержать уникальное значение для каждой записи. Такое решение можно принять, когда запись таблицы не содержала естественного ключа или когда естественный ключ слишком длинный.
В некоторых системах при описании файлов БД можно задать и ограничения целостности. Тенденции развития СУБД таковы, что даже настольные системы включают все более развитые возможности контроля целостности.
Кроме рассмотренных выше свойств полей СУБД позволяют определять и другие свойства, такие, как подпись поля (название поля, которое будет использоваться при выводе информации), формат поля и др.
Многие СУБД предоставляют возможность использовать и иные способы создания таблиц, не предполагающие непосредственного описания каждого поля проектировщиком.
Так, при создании новой таблицы можно воспользоваться образцами, которые обычно включаются в состав СУБД. Но это не освобождает от понимания основ проектирования БД, так как следует внимательно оценить, насколько предлагаемое в качестве образца решение соответствует вашим потребностям, и при необходимости изменить предлагаемую структуру БД.
Кроме того, имеются возможности полного или выборочного копирования структуры имеющегося файла при создании нового файла.
Имеются и другие способы создания таблиц БД. Так, многие СУБД позволяют проводить импорт файлов/таблиц, созданных в других приложениях, в создаваемую БД. При этом описание включенной в БД таким образом таблицы будет сформировано автоматически.
При завершении описания Структуры файла БД необходимо дать имя этому файлу (таблице).
Следует обратить внимание на то, что база данных представляет собой не просто совокупность отдельных файлов, а единое взаимосвязанное хранилище данных. Поэтому описание БД не ограничивается описанием отдельных ее файлов (таблиц). В СУБД, поддерживающих нереляционные структурированные модели данных (иерархические, сетевые), описание связей между информационными единицами является неотъемлемой частью описания БД. В реляционных СУБД (в силу специфики модели БД) описание связей в схеме БД не является обязательным. Однако многие СУБД позволяют описывать связи при описании БД; это прежде всего служит цели задания ограничений целостности.
5.2. Создание БД в Microsoft Access
Рассматривая работу в среде MS Access, еще раз обратим внимание на использующуюся в системе терминологию. Базой данных в MS Access называется совокупность таблиц, форм, отчетов, запросов, модулей, макросов. Вся эта совокупность запоминается в одном файле базы данных, имеющем расширение (.mdb).
В контексте данного раздела под «созданием баз данных» будем понимать только создание таблиц и связей между ними. Другие компоненты, включаемые в понятие базы данных в MS Access, здесь рассматриваться не будут.