Программирование >>  Создание клиентов mysql 

1 ... 170 171 172 [ 173 ] 174 175 176 ... 201


создание новой записи в таблице Room

$Query = INSERT INTO Room (Building, Name) .

VALUES ($this->building , .

. $this->name . ) ; $dbResult = mysql query($Query, $this->dbLink); $this->id = mysql insert id();

else {

обновление существующей записи

$Оиегу = UPDATE Room .

SET Building = $this->building, Name = . $this->name . . WHERE ID = $this->id ;

$dbResult = mysql query($Query, $this->dbLink);

function sqlDeleteO {

удаление объекта комнаты $Query = DELETE FROM Room .

WHERE ID = $this->id ; $dbResult = mysql query($Query, $this->dbLink);

$this->id = 0; $this->building = 0;

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

$dbLink = mysql pconnect( localhost , httpd , );

выбор базы данных test mysql select db( test , $dbLink);

/ / создание объекта здания и сохранение его в базе данных $Ь = new Building($dbLink); $b->name = Home ;

$r = new Room($dbLink); $r->name = Bedroom ; $b->room[] = $r; $r->name = Kitchen ; $b->room[] = $r; $r->name = Bathroom ; $b->room[] = $r;

$b->sqlPut 0;

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

$home = new Building($dbLink, $b->id);

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

$home->sqlDelete();



?>


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

повторное занесение объекта в базу данных $home->sqlPutО ;

повторное удаление объекта $home->sqlDelete();

Класс Building содержит четыре свойства и четыре метода. В свойстве name записано имя здания, а свойство room представляет собой массив объектов класса Room. Свойство id - это уникальный идентификатор объекта, соответствующий значению первичного ключа в таблице Building. Свойство dbLink хранит идентификатор сеанса, необходимый функциям РНР, которые работают с базами данных MySQL.

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

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

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

У объектов класса Room есть свой метод sqlPut (), по очереди вызываемый для каждой комнаты здания. PHP-программистам советую обратить внимание на использование цикла for. Цикл foreach в данном случае не подходит, поскольку он будет работать с копиями элементовмассива room, а не с самими элементами. Вызов метода sqlPut {) класса Room приведет к созданию записи, но обновление свойства id потеряется, если изменению подвергнется копия.

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

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



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

CREATE TABLE Building (

ID INT NOT NULL AUTO INCREMENT, name CHAR (32) NOT NULL,

buildingType ENUM{Residence, Store ) NOT NULL, occupants INT, parkingSpaces INT, PRIMARY KEY(ID)

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

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

Преимуществом подхода является простота реализации. Нет не-

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

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

CREATE TABLE Building (

ID INT NOT NULL AUTO INCREMENT, name CHAR (32) NOT NULL, PRIMARY KEY(ID)

CREATE TABLE Residence (

ID INT NOT NULL AUTO INCREMENT, Building INT NOT NULL, occupants INT, PRIMARY KEY (ID) ,

FOREIGNKEY (Building) REFERENCES Building (ID)



1 ... 170 171 172 [ 173 ] 174 175 176 ... 201

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика