Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MySQL. Библиотека профессионала - Аткинсон Л

..pdf
Скачиваний:
166
Добавлен:
24.05.2014
Размер:
10.41 Mб
Скачать

532 Глава 30. Работа с объектами

= "SELECT Name "FROM Building

"WHERE ID

$dbResult $row

создание массива комнат

$Query "SELECT ID "FROM Room "WHERE Building

$dbResult

new

function

global $dbLink;

0)

создание новой записи в таблице Building $Query "INSERT INTO Building (Name)

"VALUES $this >name

$dbResult $this >id

занесение в базу данных массива комнат $r < $r++)

else

обновление существующей записи $Query "UPDATE Building

"SET Name "WHERE ID

$dbResult

обновление массива комнат

$r $r++)

function

удаление всех объектов комнат

Объектно реляционные связи 533

for($r=0; $r $r++)

удаление объекта здания

"DELETE FROM Building "WHERE ID

$dbResult $this >id 0;

class Room

$building;

$name; var $id; var

function Room($dbLink, $id=0)

$this >dbLink $this >id

если задан идентификатор, загружаем объект

function

0)

извлечение данных из таблицы Room $Query "SELECT Building, Name

"FROM Room

"WHERE ID

$dbResult $this >dbLink) $row $this >building

$this >name

function

0)

if 0)

534 Глава 30. Работа с объектами

создание новой записи в таблице Room $Query = "INSERT INTO Room (Building, Name)

"VALUES

$this >name

$dbResult $this >id

else

обновление существующей записи $Query "UPDATE Room

"SET Building $this >building, "Name "WHERE ID

$dbResult

function

удаление объекта комнаты

"DELETE FROM Room "WHERE ID

$dbResult $this >id 0;

$this >building 0;

установление соединения $dbLink

выбор данных

создание объекта здания и сохранение его в базе данных $b = new

$b >name "Home";

$r new

"Bedroom"; $b >room[] "Kitchen"; $b >room[]

$r >name

извлечение объекта здания new

удаление его из данных

связи 535

повторное занесение в базу данных

повторное удаление объекта

Класс Building содержит четыре свойства и четыре метода. В свойстве name за писано имя здания, а свойство room представляетсобой массив объектов класса Room.

Свойство id — это уникальный идентификатор

соответствующий значению

первичного ключа в таблице Building. Свойство

хранит идентификатор се

анса, необходимый функциям

которые работают с базами данных MySQL.

Первый метод класса

это конструктор, вызываемый

создании

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

Метод запрашивает из базы данных название здания, соответствующее указанному идентификатору. Если бы у класса Building былидополнительные свой ства, пришлось бы запрашивать и дополнительные столбцы. В таблице Room есть внешний ключ, связывающий ее с таблицей Building, поэтому метод sqlGet по имеющемуся идентификатору здания извлекает список идентификаторов комнат. Для каждого найденного идентификатора создается объект класса Room. Выполнять от дельный запрос с целью извлечения каждого объекта этого класса — не самое эффек тивное решение, но в данном случае оно обеспечивает слабую связность. Метод sqlGet класса Room лишь извлекает записи из базы данных и помещает значения их полей в соответствующие свойства объекта, но в более сложном классе может по требоваться дополнительная обработка данных. Например, объект может отдельно хранить номер года, месяца и дня, а в базе данных всем этим свойствам соответствует один столбец типа DATE.

Метод sqlPut сохраняет текущее состояние объекта в записях базы данных. На основании значения свойства id делается выбор в пользу инструкции UPDATE либо INSERT. Если идентификатор равен нулю, предполагается, что нужно создать новую запись в таблице Building, иначе обновляется существующая запись. Функция возвращает идентификатор, сгенерированный для поля счетчика, и этот идентификатор сохраняется в свойстве id.

У объектов класса Room есть свой метод sqlPut

по очереди вызываемый для

каждой комнаты здания. PHP программистам советую обратить внимание на исполь

зование цикла Цикл в данном случае не подходит, поскольку он будет работать с копиями элементовмассива room, а не с самими элементами. Вызов метода

sqlPut

класса Room приведет к созданию записи, но обновление свойства id поте

ряется, если изменению подвергнется копия.

Метод

класса Building сначала вызывает одноименный метод каж

дого объекта массива room, после чего выполняет инструкцию DELETE для удаления записи из таблицы Building. Свойство id объекта устанавливается равным нулю, что указывает на независимость объекта от какой бы то ни было записи базы данных.

Код класса Room написан по тому же образцу, что и класс Building. После опре делений классов идет основное тело сценария. Обратите внимание на способ

536 Глава 30. Работа с объектами

объектов комнат к объекту здания. В сценарии используется один объект класса Room, копии которого с разными названиями комнат записываются в массив room. В результате не приходится создавать три разных объекта и устанавливать свойство каждого из них.

Классы Building и Room представляют собой пример отношения включения, ко гда один класс является членом другого. Другой тип отношения между объектами — это наследование. Ему стоит уделить особое внимание. Рассмотрим диаграмму, пред ставленную на рис. 30.4. На ней изображены два потомка класса Building: классы Store (магазин) и Residence (жилой дом). Код для их реализации приведен в лис тинге 30.5.

S1

R

Рис. 30.4. Класс Building и его подклассы

class Building

class Residence extends Building

var

class

var

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

В листинге 30.6 показана инструкция, которая создает таблицу, охватывающую все свойства родительского класса и двух его подклассов. Если в конкретном экземпляре класса то или иное свойство отсутствует, в соответствующую ячейку записывается зна чение NULL. Например, у объекта класса нет свойства, определяющего число жильцов, поэтому столбец occupants для него будет равен NULL. можно было

различать между собой объекты классов Residence и S

таблицу добавлен

полнительный столбец

содержащий всего два возможных значения.

Объектно реляционные связи 537

CREATE TABLE Building

ID INT NOT NULL AUTO_INCREMENT, name NOT NULL,

NOT NULL, occupants

INT, PRIMARY

Недостатком такого подхода является сильная связность. Если возникнет димость поменять определение одного из подклассов, придется соответствующим образом изменить и саму таблицу, а это затронет все ее записи. Кроме того, в одной таблице смешиваются пространства имен нескольких классов, что зачастую приводит к чрезмерному удлинению имен столбцов. Например, если у обоих подклассов есть свойство name, потребуется создать два разных столбца, в имена которых в качестве префикса входит имя подкласса.

Рассмотренный плохо работает также в случае множественного вания. В листинге 30.6 можно вместо типа ENUM использовать тип SET, но это не ком пенсирует тот факт, что в таблиц е будут присутствовать столбцы для всех возможных классов. Таблицы, в которых слишком много значений NULL, свидетельствуют о том, что разработчики базыданных не придерживалисьтребований реляционной модели.

Преимуществом подхода является простота реализации. Нет не обходимости выполнятьобъединения таблиц, тем самым ускоряется доступ к данным. Конечно, придется просматривать большее число записей, но наличие индексов ком пенсирует этот недостаток.

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

CREATE TABLE Building

ID NOT NULL name NOT NULL,

PRIMARY

CREATE TABLE Residence

ID INT NOT NULL

Building INT NOT NULL,

occupants INT,

PRIMARY

FOREIGN KEY (Building) REFERENCES Building (ID)

538 Глава 30. Работа с объектами

CREATE TABLE Store

ID INT NOT NULL

Building INT NOT NULL,

INT,

PRIMARY

FOREIGN KEY (Building) REFERENCES Building (ID)

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

Реализация такого рода базы данных требует определенных усилий и приводит к большого количества таблиц. Следовательно, возрастает число операций объединения, что сказывается на скорости работы с базой данных. Тем не менее опи

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

РАСШИРЕНИЕ

ВОЗМОЖНОСТЕЙ MYSQL

этой

Библиотека функций отладки

Создание наборов символов

Создание функций

Создание процедур

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

имеющиеся в MySQL.

Библиотека функций отладки

В MySQL входит библиотека функций отладки, первоначально созданная Фредом Фишем (Fred Fish). Чтобы разрешить ее нужно на этапе компиляции программы вызвать сценарий с опцией Если в распоря жении имеется бинарный дистрибутив, проверьте версию какого либо исполняемого файла. Программы, скомпилированные с поддержкой отладки, имеют суффикс Библиотека функций отладки является частью библиотеки о которой рассказывалось в главе 16, "Использование библиотеки языка С". Макросы библиотеки объявлены в файле

Названия всех макросов начинаются с префикса DBUG_ (табл. 31.1). Если нужно отключить отладку, определите макроконстанту DBUG_OFF. При ее наличии все ос тальные макросы игнорируются.

Макрос

Описание

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

но перед вызовом каких либо инструкций.

DBUG