Базы данных в сети
Связи между таблицами
В основе современных баз данных лежит понятие связей (relationships). Они позволяют разработчикам связывать несколько таблиц в базе посредством общих данных. При помощи взаимосвязей разработчики баз данных моделируют таблицы, отражающие взаимодействие объектов в реальности и позволяющие эффективно обновлять данные даже по прошествии длительного времени. На диске содержится готовый файл базы данных, который и будет использоваться в книге. Он тоже включает много связей между таблицами. При выполнении упражнений создавать дополнительные связи не потребуется, однако нередко придется извлекать и использовать данные сразу из нескольких таблиц. Без понимания роли связей в базах данных этого сделать невозможно.
Связи не относятся к какой-то конкретной системе управления базами данных, это обязательный компонент не только для Access и MySQL, но и для любой базы данных и, в частности используются при веб-разработке, например, Microsoft SQL Server, Oracle или PostgreSQL.
Понять принцип работы связей проще всего на примере. Для хранения информации о продажах компании применяется электронная таблица Excel. Каждая операция должна храниться в отдельной строке, поэтому электронная таблица содержит следующие столбцы:
Со временем в таблице накапливаются сотни записей. Многие из них соответствуют покупкам, совершенным одними и теми же клиентами. Проблема состоит в том, что при совершении повторной покупки информация об адресе клиента снова сохраняется. Со временем некоторые клиенты переезжают. Их новые адреса вводятся в электронную таблицу, но во всех прошлых записях остается прежний адрес. Существует вероятность, что рано или поздно кто-то случайно использует для отправки товара неверный адрес. Обновление адресов становится довольно непростой задачей из-за их невероятного количества. К сожалению, в Excel нет средств, позволяющих устранить эту проблему.
При формировании базы данных логичнее отделить все записи о клиентах от записей, относящихся к совершенным ими покупкам. В этом случае в одной таблице будут отслеживаться покупки, а в другой – храниться информация о клиентах. В таблице клиентов каждому будет соответствовать только одна запись. При переезде клиента потребуется обновить только одну соответствующую ему запись, а не все записи о его покупках. В таблице, содержащей записи о покупках, вместо перечисления всей информации о покупателе будет указан уникальный идентификатор, соответствующий определенной записи в таблице клиентов. Такой тип связи между таблицами позволяет создавать базы данных.
На этот раз таблица клиентов будет выглядеть следующим образом:
Таблица операций будет выглядеть так:
Обе таблицы содержат поле cust_ID. В таблице клиентов поле cust_ID включает уникальные идентификаторы, называемые также первичными ключами (primary key). У каждой записи в таблице всегда существует свой идентификатор, который не повторяется. В таблице могут оказаться два клиента с одним именем, например, Джон Смит, или два одинаковых почтовых индекса 90210. Но благодаря тому, что каждой строке присваивается первичный ключ cust_ID, в таблице обеспечен порядок, предполагающий корректное обновление, удаление и добавление данных.
В таблице покупок одно и то же значение cust_ID, напротив, может повторяться больше одного раза — в зависимости от того, сколько покупок совершил тот или иной клиент. Когда первичный ключ одной таблицы применяется в качестве поля другой, он называется внешним ключом (foreign key). При использовании внешних ключей между таблицами образуются связи (relationships). Они позволяют избавиться от избыточной (дублирующей) информации и сохранить целостность данных.
На приведенном ниже рисунке показана взаимосвязь между двумя таблицами, описанными в этом примере. Линия между таблицами обозначает существование между ними связи. Число 1, расположенное слева, означает, что в таблице tbl_customers параметр cust_ID является уникальным, а знак бесконечности, находящийся справа, указывает, что в таблице tbl_transactions одно и то же значение параметра cust_ID может повторяться сколько угодно. Это взаимосвязь относится к типу связи с отношением "один-ко-многим".
Возможности связей между таблицами не ограничены уменьшением избыточности данных. Они также позволяют создать SQL-запрос, извлекающий данные из обеих таблиц на основе определенного критерия. Например, запрос, выводящий имена и фамилии всех клиентов, совершивших покупки на сумму свыше 100 долларов. Формы, предназначенные для записи сразу в несколько таблиц, тоже функционируют на основе взаимосвязей.
Базы данных в сети
После описания основных компонентов и функций баз данных пора рассказать о том, как они работают в сети.
Существует множество вариантов для применения содержимого баз данных в сети. Самый простой способ, который будет реализован к концу урока – это отображение содержимого поля на веб-странице. Но, помимо отображения простой строки текста, существуют возможности выводить несколько полей сразу, динамически заполнять меню элементами и производить аутентификацию пользователей. Кроме отображения на странице полученная информация нередко помещается на хранение в таблицы базы данных. Благодаря этому реализованы средства для регистрации пользователей, заполнения опросников, тестов и систем управления контентом.
Если сравнить веб-страницы, управляемые базами данных, с объектами баз данных в Access, речь о которых шла выше, станет понятно, что веб-страницы и веб-формы могут служить эффективной заменой отчетов и форм базы данных. Веб-страницы точно так же, как и отчеты, выводят и отображают данные, а веб-формы выполняют ту же функцию, что и формы баз данных. Достоинство такой системы заключается в том, что для обновления ее содержимого пользователям не требуется Access или MySQL (или любая другая реляционная СУБД). К тому же, пользователи могут находиться в любой точке земного шара, но при этом иметь доступ к базе благодаря Интернету. Более того, поскольку пользователи не имеют прямого доступа к базе данных, снижается вероятность утечки данных (умышленной или случайной).
С плюсами все ясно, осталось выяснить, как же все это работает. Владелец сайта имеет доступ к файлам, размещенным на жестком диске сервера. Посетители сайта не имеют прав на изменение файлов на сервере, так как это подорвало бы систему безопасности сервера. Но можно предоставить права доступа к определенным файлам на сервере конкретным приложениям.
Один из способов – это использование интерфейса ODBC (Windows), позволяющего создать имя источника данных (DSN – Data Source Name), позволяющее ASP или ColdFusion обмениваться данными с базой данных Access. Эта взаимосвязь отображена на приведенной ниже схеме.
Эта схема дает наглядное представление о многих процессах при работе с базами данных. Следует обратить внимание на то, как много промежуточных ступеней отделяют пользователя от реальных данных. Эта сложная последовательность позволяет пользователю получить доступ к данным, но защищает данные от прямого доступа, тем самым обеспечивая определенный уровень безопасности.
Схема состоит из четырех частей, характеризующих уровень клиента, уровень промежуточного ПО, уровень ODBC и уровень базы данных.
К уровню клиента относится статический HTML-код, обрабатываемый браузером. Изначально код страницы может быть как статическим, так и динамическим, но, как известно, к моменту передачи страницы браузеру она состоит полностью из статического HTML-кода.
В ODBC есть вся информация, необходимая для доступа к базе данных, включая сведения о драйвере базы данных и путь к базе. Эти два параметра хранятся в ODBC и вызываются при помощи DSN.
Наконец, SQL-запрос достигает самой базы данных, ищет нужные таблицы и извлекает соответствующую информацию.
Но это только первый этап. На обратном пути данные идут по тому же маршруту, что и запрос, пока не достигают уровня промежуточного ПО. В этот момент извлеченные из базы данные сохраняются в оперативной памяти сервера (RAM). Данные еще не достигли страницы, хотя уже почти у цели. Сохраненные в памяти данные, которые получены в результате запроса, называются набором записей (recordset). Для вывода набора записей (или любого его подмножества) в HTML-код применяется ASP или ColdFusion. Принцип здесь тот же, что и при выводе переменных формы. В итоге, пользователь может просмотреть извлеченные данные на странице.
Связка PHP/MySQL работает по другой схеме, главное отличие которой заключается в том, что в ней отсутствует интерфейс ODBC. Вместо этого информация, необходимая для доступа к базе данных, помещается непосредственно в код. Подробнее об этом будет рассказано позже, но основной идеей является то, что PHP содержит специальную функцию ( mysql_connect() ), которая используется для подключения к базе данных MySQL. В случае применения этой функции указывается путь к серверу баз данных, а также имя пользователя и пароль для доступа. После этого вызывается другая функция ( mysql_select_db() ), позволяющая указать имя базы данных, к которой требуется получить доступ. В MySQL может содержаться несколько баз данных, в отличие от Access, где каждая база данных хранится в отдельном файле с расширением .mdb. Несмотря на то, что в PHP и MySQL употребляется несколько иной подход, в общих чертах процесс остается прежним.