Теория СУБД
- Теория СУБД
- ЗА ТАБЛИЦАМИ — НАШЕ БУДУЩЕЕ!
- СВЯЗЫВАЕМ ДАННЫЕ
- ОБЪЕКТНЫЙ РАЙ
- ЛОКАЛЬНАЯ БАЗА
- СЕТЕВАЯ БАЗА ДАННЫХ
- КЛИЕНТ-СЕРВЕР
- ТРЕТИЙ УРОВЕНЬ
- ЛОГИКА
- ВИДЫ СТРУКТУР БАЗ
- ОБЗОР РЫНКА
- РАЗВИТИЕ ТЕХНОЛОГИЙ БД
- БАЗЫ ЗНАНИЙ И ЭКСПЕРТНЫЕ СИСТЕМЫ
- АНАЛИЗ ДАННЫХ И OLAP-ТЕХНОЛОГИИ
- ХРАНИЛИЩА ДАННЫХ И КОРПОРАТИВНАЯ ПАМЯТЬ
- ИСТОРИЯ РАЗВИТИЯ ИНТЕРФЕЙСОВ ДОСТУПА К БАЗАМ ДАННЫХ
- ЧТО ДАЛЬШЕ?
На этом моя лекция подходит к концу, в отличие от истории развития интерфейсов DataBase Connectivity. Безусловно, существующие стандарты далеки от идеала, но не может не радовать сам факт их наличия. Когда разработчики стандартизуют интерфейсы, они делают шаг навстречу партнерам и пользователям и шаг назад по отношению к концепции тупого выжимания денег из своего сегмента рынка. Так что больше стандартов, хороших и разных, помогающих новым разработкам ускорять прогресс, а не вставлять палки в его колеса.
КАК СОЗДАТЬ И ИСПОЛЬЗОВАТЬ БАЗУ ДАННЫХ
Недостатки этого способа станут явными тогда, когда ты захочешь более эффективно обрабатывать накопленные данные. И ты постепенно придешь к мысли о создании базы данных, а для ее претворения в жизнь потребуется знать способы создания эффективных баз данных, а также средства использования этих данных для оперативного извлечения полезной информации.
БАЗА ДАННЫХ: ЗАЧЕМ И ПОЧЕМУ?
Многие прекрасно знают, что "эта груда железа" предназначена для автоматической обработки данных. Причем неважно, для каких целей ты используешь ее: общаешься с кем-нибудь, играешь, слушаешь музыку, смотришь видео или решаешь математические задачи. В любом случае компьютер использует данные определенного типа, переводит их на свой машинный язык (на "нули" и "единицы"), а потом обрабатывает в своей "оперативке". Какая-то часть данных "сбрасывается" на винчестер и сохраняется в виде файлов. Во всех перечисленных случаях пользователя мало волнует порядок расположения данных в этих файлах. Другое дело, когда ты попытаешься создать компьютерную информационную систему. Например, персональный телефонный справочник или статистику посещаемости форума в твоей сети.
В первом случае можно, конечно, ограничиться обыкновенными записями в текстовом файле (например, в документе Word), тем более что туда легко можно заносить разнообразную "списочную" информацию: сведения о своих друзьях-абонентах, их адресах проживания и т.п. Способ представления и размещения информации в этом случае ты придумаешь сам. К примеру, построчно запишешь: "Иванов, Иван, Иванович, 223-5485, ул. Декабристов, 18/1-64", "Сергей Сергеевич Сидоров, 375-6986, пр. Ленина, д.18, кв. 49" и т.д. Что же плохого в такой организации данных?
Во-первых, тебе, вероятно, потребуется упорядочивать информацию по различным признакам (например, по фамилиям или по адресам), а во-вторых, быстро извлекать выборки с произвольным сочетанием признаков (например, список абонентов, имеющих домашние телефоны в определенном доме).
Однако описанная организация данных не позволит сделать ни первое, ни второе. Дело в том, что упорядочить информацию в текстовом файле достаточно сложно. Гораздо проще сделать это без всякого компьютера, имея сведения, записанные на картонных карточках :). Машина не сможет даже выбрать правильно номера домов и квартир, потому что они могут быть записаны по-разному. Это для тебя записи "18/1-64" и "д. 18, корп. 1, кв. 64" — одно и то же, а для компьютера это совершенно разные вещи. А если взять второй упомянутый пример по учету посещаемости форума, то здесь Word’у вообще "не объяснить", где IP-адрес машины, а где дата подключения этой машины, которая нужна для подсчета посещений за определенный период.
Чтобы научить глупую машину безошибочно искать и систематизировать данные, надо прежде всего сообщить ей правила игры (соглашения) о способах представления данных. Такой процесс называется структурированием информации, и он производится путем введения типов: текстовых, числовых и т.п. А также форматов данных (например, формат даты). Для таких структурированных данных придумали специальный вид файлов — базу данных (БД). Другими словами, база данных предназначена для хранения некоторого объема структурированных данных под определенным именем во внешней памяти.
КАКИЕ ОНИ БЫВАЮТ?
Почти сорокалетний опыт развития баз данных показал жизнеспособность трех типов моделей данных: иерархической, сетевой и реляционной.
В иерархической модели, которая появилась на свет раньше других, все объекты и атрибуты базы данных образуют иерархический набор — такую структуру, в которой все элементы связаны между собой отношениями подчиненности. При этом любой элемент может подчиняться только какому-нибудь одному другому элементу. Такую форму зависимости удобно изображать в виде древовидного графа — в виде связанной и не имеющей циклов схемы, составленной из точек и стрелок.
Основным достоинством иерархической модели данных является простота ее восприятия и использования, а также быстрота доступа к данным. Но без недостатков тут не обошлось. Во-первых, не все связи между объектами в реальном мире подчиняются строгой иерархии, скорее наоборот… Во-вторых, из-за строгой иерархической упорядоченности объектов значительно усложняются операции включения и удаления (удаление исходных объектов приводит к удалению порожденных). Плюс сложность манипулирования данными в такой базе, поскольку требуется производить в явном виде навигационные операции, которые связаны с перемещением указателя, определяющего текущий экземпляр конкретного элемента данных.
Позже теоретиками была разработана сетевая модель, которая является расширением иерархического подхода к организации данных. В иерархических структурах объект-потомок должен иметь только одного предка, а в сетевой структуре потомок может иметь любое количество предков.
Главным достоинством сетевой модели данных является простота реализации любых взаимосвязей, часто встречающихся в реальном мире. Но за такое удовольствие приходится платить сложностью разработки. Например, прикладной программист обязан разбираться в деталях всей этой навороченной структуры базы данных, поскольку при обработке он должен осуществлять навигацию ("продвижение") среди различных экземпляров записей.
При этом обе дореляционные (читай "дореволюционные") модели — иерар хическая и сетевая — страдают одним большим недостатком: они слишком привязаны к конкретным данным. Эта зависимость послужила главным препятствием на пути к развитию реальных программных систем, основанных на базах данных: слишком много изменений приходилось вносить в код прикладной программы при каждой корректировке структуры базы (логическая зависимость), а также при изменении физического носителя данных (физическая зависимость).
Наконец, доктор наук математик Э.Ф. Кодд (США) придумал реляционную модель, гениальную по своей простоте. Единственной структурой данных, которую видит пользователь, является двухмерная таблица. Название "реляционная" происходит от слова relation (англ. "отношение"). Кодд придумал также основные опе рации, которые легко могут обработать данные в таблицах и получить результат в виде новой таблицы. Причем уникальность таких манипуляций данными в том, что за одну операцию можно обработать одновременно все данные таблицы и даже нескольких таблиц. И тебе не придется писать никаких циклических процедур, обрабатывая каждую запись отдельно!
Простота использования реляционной модели обеспечила ее безусловный успех, который длится вот уже более 30-ти лет. Одно из достоинств этой модели — возможность преобразовать любую структуру данных в простую двумерную таблицу.
ЧТО ТАКОЕ ПРАВИЛЬНАЯ БАЗА ДАННЫХ?
Поскольку ты решил использовать базу данных для хранения информации, то запомни два общих принципа построения "правильной базы данных". Во-первых, постарайся обеспечить целостность (правильность) и непротиворечивость данных в БД: физическую сохранность данных, предотвращение неверного использования данных (например, ввода недопустимых значений), контроль операций вставки, обновления и удаления данных, защиту от несанкционированного доступа и т.д. Во-вторых, поддерживай минимальную избыточность данных. Любой элемент данных должен храниться в базе в единственном экземпляре, чтобы не дублировались операции, производимые над ним.
За хранение данных в базе, их обработку и взаимодействие с прикладными программами отвечает отдельный класс программ — системы управления базами данных (например, MS Access, FoxPro, MS SQL Server, Oracle и другие). Они отличаются друг от друга функциональностью, производительностью, стоимостью и т.п., но, в принципе, все предназначены для решения вышеуказанных задач. Если хочешь заставить СУБД правильно выполнять свои функции и сопровождать базу данных, постарайся организовать свою работу так, чтобы соблюдались оба принципа. Иначе тебе придется в основном бороться с самой СУБД. Что часто и случается :).
НУЖНА НАГЛЯДНАЯ СХЕМА!
Как ты уже понял, при построении "правильной базы данных" многое зависит от ее структуры, то есть схемы. Из каких таблиц и атрибутов должна состоять схема базы данных? Какие атрибуты выбрать в качестве ключевых? Надо ли связывать эти таблицы между собой? Подобные вопросы могут возникнуть у кого угодно, и чтобы ответить на них, требуется научиться моделировать схему базы данных. Для этого были придуманы специальные диаграммы "сущность-связь" (ER-диаграммы), которые позволяют легко и наглядно проектировать структуру баз данных без привязки к конкретным СУБД. Методика, согласно которой используются ER-диаграммы, оказалась настолько успешной и полезной на практике, что легла в основу целого класса программных продуктов, так называемых CASE-средств проектирования информационных систем. Наиболее распространенная программа этого класса — Erwin
А КАК ЭТО СДЕЛАТЬ?
Главная проблема, которую требуется решить при создании базы данных, — создать для нее такую структуру, которая бы обеспечивала минимальное дублирование информации и упрощала процедуры обработки и обновления данных, представленных набором таблиц. Для того чтобы облегчить твою жизнь, теоретики баз данных предложили универсальный способ решения этой проблемы. Этот способ сформулирован в виде специальных требований к организации данных в ходе проектирования, которые получили названия нормальных форм (НФ). Первые три нормальные формы оказались самыми живучими и распространились больше других.
Согласно требованиям первой нормальной формы, все атрибуты таблицы должны быть простыми, то есть состоять из одного неделимого элемента данных. Например, если сделать в базе данных атрибут "Адрес",то в него можно будет заносить значения данных типа "г. Москва, 3-я улица Строителей, д. 25, кв. 12". Но определить, из какого города человек с таким адресом и существует ли такой же адрес в другом городе, тебе будет, поверь, очень сложно, потому что придется писать целую процедуру обработки текстовой записи, чтобы вычленить город.
Вторая нормальная форма требует соблюдения условий первой НФ, а также дополнительно каждый неключевой атрибут должен однозначно зависеть только от первичного ключа. Имеются в виду функциональные зависимости из реальной предметной области. Здесь возникают проблемы с выявлением зависимостей, если первичный ключ является составным, то есть состоит из нескольких атрибутов.
Таблица находится в третьей нормальной форме, если она удовлетворяет требованиям второй НФ и если при этом любой неключевой атрибут зависит от ключа нетранзитивно (термин понятен по примеру из жизни — транзитный, промежуточный вокзал). Транзитивной является такая зависимость, при которой какой-либо неключевой атрибут зависит от другого неключевого атрибута, а тот, в свою очередь, уже зависит от ключа.
СХЕМА ЕСТЬ — УМА НЕ НАДО?
После определения основных объектов и характеризующих их атрибутов надо продумать "поведенческие" аспекты твоей базы данных. Другими словами, определить, что будет происходить при вставке, корректировке и удалении реальных за писей. Останутся ли при этом данные в твоей базе правильными? Не появится ли в ней противоречивая информация? Эти вопросы порождают известную в теории проблему обеспечения целостности данных. Целостность бывает двух видов: целостность сущностей и целостность по ссылкам.
Объекту или сущности реального мира в реляционных БД соответствуют строки таблиц. Требование целостности сущностей состоит в том, что любая строчка таблицы должна отличаться от любой другой строчки этой же таблицы. Это требование ты уже выполнил создав первичный ключ, то есть уникальный идентификатор строк. Поэтому вставить две одинаковые записи данных в таблицу ты уже точно не сможешь: система не позволит.
С обеспечением требований по ссылкам на другие таблицы дело обстоит сложнее. Лучше показать это на примере. Допустим, ты разрабатываешь базу данных для сопровождения своего форума, и тебе надо хранить информацию о зарегистрированных пользователях. Каждый пользователь состоит в определенной группе, в соответствии с которой ему назначены права (например, administrators, moderators, registered, banned и т.д.). При правильном проектировании структуры у тебя появятся две связанные таблицы:
USERS (id_user, user_login, user_mail, user_icq, fk_id_group), первичный ключ id_user;
GROUPS (id_group, name_group, rights) первичный ключ id_group
Атрибут fk_id_group появляется в таблице USERS не потому, что номер группы является собственным свойством пользователя, а лишь для того, чтобы при необходимости восстановить полную информацию о группе. Значение атрибута fk_id_group в любой строке таблицы USERS должно соответствовать значению атрибута id_group в некоторой строке таблицы GROUPS. Такой атрибут называется внешним ключом (foreign key), поскольку его значения одноз начно характеризуют объекты, представленные строками некоторого другого, внешнего отношения (то есть задают значения их первичного ключа). Отношение, в котором определен внешний ключ, ссылается на соответствующее отношение, в котором такой же атрибут является первичным ключом.
Требование целостности по ссылкам состоит в том, что для каждого значения внешнего ключа в таблице, к которой ведет ссылка, должна найтись строка с таким же значением первичного ключа. Или значение внешнего ключа должно быть неоп ределенным, то есть ни на что не указывать. В нашем примере это означает, что если для пользователя форума указан номер группы, эта группа должна обязательно существовать в таблице GROUPS.
Каким образом обеспечить ссылочную целостность? Понятно, что при обновлении ссылающегося отношения (например, в таблице USERS вставляешь новые строки или корректируешь значения внешнего ключа, то есть переводишь пользователя в новую группу) достаточно следить за тем, чтобы не появлялись некорректные значения внешнего ключа. Но как быть при удалении из таблицы строки, к которой ведет ссылка? Предусмотрены две возможные операции: каскадирование (cascade) или ограничение (restrict). Эти операции можно установить на связь между двумя таблицами.
При каскадировании удаление строк в таблице приводит к удалению соответствующих строк в связанном отношении. Например, удаление информации о какой-нибудь группе приведет к удалению информации о всех пользователях этой группы. Подумай, нужно ли тебе такое? Если установить на связь операцию ограничения, то будут удаляться лишь те строки, для которых связанной информации в другой таблице нет. Если такая информация имеется, то удаление осуществить нельзя. В этом случае сначала нужно или удалить ссылающиеся строки, или соответствующим образом изменить значения их внешнего ключа. Например, удаление информации о какой-либо группе на форуме возможно выполнить в том случае, если в этой группе нет ни одного пользователя.
Необходимо также предусмотреть технологию того, что будет происходить при попытке обновления первичного ключа отношения, на которое ссылается некоторый внешний ключ. Здесь имеются те же возможности, что и при удалении: можно каскадировать или ограничить операцию. Например, ты захотел изме-ненить id_group в таблице GROUP на форуме и одновременного отразить все изменения на заинтересованных пользователях в таблице USERS. Тогда установи операцию каскадирования при обновлении данных на связь между этими таблицами.
В современных реляционных СУБД, как правило, можно выбрать способ поддержания целостности по ссылкам для каждой отдельной ситуации определения внешнего ключа. Конечно, для принятия такого решения необходимо тщательно анализировать требования конкретной предметной области.
- << Назад
- Вперёд