Эта статья посвящена внутренней структуре реляционных баз данных. Вы узнаете о взаимосвязях между таблицами реляционной базы данных. Мы рассмотрим понятия ключа и индекса. В конце занятия мы расскажем о нормализации построенной модели базы данных.
Из этой статьи вы узнаете:
- что такое ключи и индексы и зачем они нужны;
- каковы основные виды связей таблиц;
- что такое три основные нормальные формы таблиц и способы нормализации;
- что такое средства CASE.
Поля таблицы могут определять так называемые ключи и индексы.
Ключ— это комбинация нескольких полей, данные в которых однозначно определяют запись Таблицы.
Ключи бывают простыми и сложными (составными).
Простой ключ — это ключ, состоящий из одного поля.
Сложный или составной ключ включает в себя данные нескольких полей. Данные простого ключа должны быть уникальными. Составной ключ может иметь повторы в отдельных полях, но не во всех одновременно.
Соответственно поля, по которым строится ключ, называются ключевыми полями. В каждой таблице может быть только один ключ.
Ключ иногда называют первичным ключом или главным индексом.
Для чего же служит ключ? Прежде всего, для обеспечения однозначного определения записей таблицы. Кроме того, ключ предназначен для более быстрого выполнения запросов к базе данных. По ключевым полям организуется связь между таблицами базы данных. У ключа есть еще много других функций, они будут объясняться по мере изложения материала книги.
Сведения о ключе таблицы могут храниться как вместе с данными таблицы, так и в отдельном файле. Этот файл имеет такое же имя, что и файл таблицы, но другое расширение. Например, в базе данных Microsoft Access информация о ключе содержится вместе с данными в одном файле, который имеет расширение .MDB.
А Paradox выделяет для информации о ключе отдельный файл с расширением .РХ.
Ключевой файл содержит значения ключа, которые располагаются в определенном порядке. Для каждого из значений ключа имеется уникальная ссылка, которая указывает местоположение соответствующей записи в файле таблицы. Таким образом, во время поиска в таблице будет выполнен прямой доступ к необходимой записи на основании упорядоченных значений ключа, а не последовательный перебор записей таблицы. Тем самым значительно увеличивается скорость доступа к искомой информации, хотя в результате размер базы может сильно вырасти (возможно, даже в два раза) за счет хранения дополнительной ключевой информации.
Ключевые поля вам придется определять самостоятельно, поэтому следуйте представленным ниже правилам, которые помогут достаточно эффективно выбрать эти поля:
- ключевым полем не может быть поле, содержащее графику, или поле типа memo, включающее в себя комментарии;
- нежелательно выбирать в качестве ключевого поля поле, содержащее фамилии людей, так как существует большая вероятность включения в базу данных однофамильцев и при этом будет нарушена уникальность ключа;
- если вы используете поле, по которому производится нумерация записей (например, автоинкрементное поле), то имеет смысл сделать его ключевым, поскольку номер записи будет уникальным;
- старайтесь задавать ключевые поля в каждой таблице базы данных, даже если их присутствие на первый взгляд не является необходимым.
- ключ не должен содержать поля, которые можно удалить, не нарушив при этом уникальности ключа;
Индекс— это комбинация нескольких полей, которые служат для быстрого доступа к необходимой информации.
Основным отличием индекса от ключа является то, что поля индекса могут определять не одну, а несколько записей. Таким образом, индекс не всегда однозначно определяет запись в таблице базы данных.
Индексы так же, как и ключи, могут быть простыми и составными. Простой индекс состоит из одного поля, асоставной —из нескольких полей.
Поля, по которым строится индекс, называют индексными полями. Процесс создания индекса называетсяиндексированием таблицы.
В зависимости от используемого типа базы данных, индексы могут храниться как вместе с данными, так в отдельных файлах.
Индекс используется для увеличения скорости доступа к данным, для быстрой сортировки данных таблицы, а также для поддержки других функций, которые будут рассмотрены далее.
В отличие от ключа, который является уникальным в каждой таблице, индексов в ней может быть несколько. Это в первую очередь необходимо для быстрой сортировки по нужному полю или полям. Если эти поля проиндексированы, то сортировка по ним будет выполнена значительно быстрее, чем по обычным полям. В любой момент времени можно активировать любой из индексов таблицы. Именно по активному (текущему) индексу обычно будет выполняться сортировка записей таблицы. Следует, однако, заметить, что, несмотря на наличие нескольких индексов, таблица может не иметь текущего индекса.
Вообще говоря, поведение индексов и ключей зависит от типа используемой базы данных. Так, например, в таблицах Paradox ключ автоматически является главным индексом, который не имеет имени.
В то же время в таблицах dBase ключ в принципе не создается, вместо него используется один из индексов. Но в общем случае ключевые поля обычно автоматически индексируются.
Реляционная база данных может состоять из одной или нескольких таблиц. В ситуации, когда в базе данных имеется всего одна таблица, организация данных довольно проста и никаких связей нет. Но в большинстве случаев база данных содержит в себе несколько таблиц, которые связаны между собой тем или иным способом. Процесс организации связей между таблицами называется связыванием таблиц.
Связи между таблицами могут устанавливаться как в процессе проектирования базы данных, так и в процессе выполнения приложения. В реляционной базе данных могут присутствовать как связанные, так и отдельные таблицы. Для того чтобы связать две или несколько таблиц базы данных, предусмотрены так называемые поля связи.
При связывании таблиц используются понятия главной таблицы и подчиненной таблицы.
Главная таблица {родительская таблица или master) — это таблица, в которой содержатся основные данные.
Подчиненная таблица {дочерняя таблица или detail) — таблица, значения в полях которой зависят от значений главной таблицы.
Главная таблица может иметь несколько подчиненных таблиц.
Таким образом, при перемещении по записям главной таблицы будет автоматически производиться перемещение по записям подчиненной таблицы.
В каждой подчиненной таблице для организации связи с главной таблицей берется индекс, состав полей которого должен частично или полностью совпадать с составом полей главной таблицы.
Само название связи между таблицами реляционной базы данных формируют по типу таблиц:
- главный—подчиненный,
- родительский—дочерний или master—detail.
Как было уже сказано на первом занятии, существует четыре вида связи между таблицами:
- один к одному;
- один ко многим;
- много к одному;
- много ко многим.
Вид связи один к одному означает, что каждой записи в главной таблице соответствует одна запись в подчиненной таблице. При этом не исключается случай, когда некоторым записям главной таблицы может не найтись соответствующих записей в подчиненной таблице. Этот вид связи используется обычно для упрощения структуры одной таблицы с большим количеством полей путем разбиения ее на несколько таблиц. При этом в главной таблице остаются поля с наиболее важной информацией, а остальные поля распределяются между подчиненными таблицами.
Вид связи один ко многим означает, что одной записи главной таблицы может ставиться в соответствие несколько записей в подчиненной таблице. При этом не исключается случай, когда записи главной таблицы не будет поставлено в соответствие ни одной записи в подчиненной таблице. Этот вид связи применяется в базах данных наиболее часто. При перемещении по записям в главной таблице будут автоматически становиться доступными записи в подчиненной таблице, у которых значение поля связи равно значению поля связи текущей записи главной таблицы. В качестве примера организации такого вида связи можно привести базу данных, состоящую из двух таблиц, которая содержит данные о покупателях и товаре. В первой, главной таблице хранятся сведения о покупателях (фамилия, имя, отчество, наименование организации и т. п.), во второй —сведения о приобретенном данным покупателем товаре. Один покупатель может приобрести один или несколько товаров.
Вид связи много к одному является аналогом вида один ко многим, но отличается направлением, то есть одной записи в подчиненной таблице может соответствовать несколько записей главной таблицы.
Последний вид связи много ко многим означает, что одной записи главной таблицы могут быть сопоставлены несколько записей подчиненной таблицы и, наоборот, одной записи подчиненной таблицы может соответствовать несколько записей главной таблицы. Ярким примером организации такого вида связи является база данных типа «Расписание», подразумевающая, что в одной учебной аудитории может заниматься несколько групп и наоборот, одна группа может заниматься в нескольких аудиториях. Таким образом, данные об аудиториях могут находиться и одной таблице, а о группах — в другой. При этом трудно утверждать, что одна пи таблиц является главной, а вторая — подчиненной.
Данный вид связи является наиболее сложным, поэтому он применяется очень редко.
Заметим, что при работе со связанными таблицами нужно выполнять некоторые дополнительные действия. Так, при удалении записи главной таблицы необходимо удалять все соответствующие ей записи из подчиненных таблиц. Такое удаление называется каскадным.
При добавлении записи в подчиненную таблицу обязательно нужно устанавливать значение поля связи этой записи равным значению соответствующего поля связи записи из главной таблицы.
Изменения значений поля связи главной таблицы нужно производить только вместе с соответствующим изменением значений поля связи в подчиненных таблицах. Если это не будет сделано, может нарушиться соответствие между записями главной и подчиненных таблиц.
Для построения эффективной структуры базы данных нужно на всех этапах проектирования ориентироваться на то, чтобы создаваемая структура обеспечивала:
- достаточно быстрый доступ к данным;
- отсутствие повторяющихся записей;
- целостность данных.
Кроме того, в процессе разработки структуры базы данных может возникнуть так называемая избыточность информации.
Избыточность информации — это повторение (дублирование) данных, содержащихся в базе данных.
Тем не менее повторение одних и тех же данных может присутствовать в базе данных и не вести к избыточности данных. В этом случае говорят о простом или неизбыточном повторении данных. Такое повторение данных может иметь место, например, при указании города проживания сотрудника организации. Пример простого повторения данных приведен в табл. 2.1.
Таблица 2.1. Простое повторение данных |
|
ФИО сотрудника |
Город проживания сотрудника |
Иванов Иван Иванович |
Абакан |
Петров Петр Петрович |
Абакан |
Сидоров Иван Петрович |
Черногорск |
Михайлов Василий Борисович |
Минусинск |
Семенов Иван Данилович |
Абакан |
Васильев Сергей Анатольевич |
Абакан |
Из приведенной выше таблицы видно, что четыре сотрудника проживают в одном и том же городе. Для каждого из этих сотрудников город проживания является уникальным.
Избыточность данных может приводить к различным аномалиям:
- аномалии удаления;
- аномалии обновления;
- аномалии ввода.
Аномалии удаления возникают тогда, когда удаляется какая-либо из записей, содержащая дублированные данные. В этом случае будет потеряна сопутствующая информация. Например, при удалении любой из записей из табл. 2.1 пропадет информация о ФИО сотрудника.
Аномалии обновленияимеют место, если значение поля одной записи изменяется, а аналогичные значения того же поля для всей таблицы остаются без изменения.
Аномалии ввода можно встретить, когда во время ввода новых записей в таблицу для ее полей заданы недопустимые значения либо не задано значение поля, которое обязательно должно заполняться.