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

1 ... 168 169 170 [ 171 ] 172 173 174 ... 201


function Room{$name= unnamed ) {

$this->name = $name;

метод для определения названия комнаты

function getNameO

return{$this->name);

создание объекта здания $home = new Bui1ding;

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

$home->addRoom(new Room( kitchen )); $home->addRoom(new Room( bedroom ));

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

if(!($dbLink = mysql pconnect( localhost , httpd , ))) {

print( Could not connect to server!<br>\n ) print(mysql errno() . : . mysql error() exit 0 ;

<br>\n );

выбор базы данных test

if( !mysql select db( test , $dbLink))

print( Could not select database!<br>\n ); print(mysql errno() . : . mysql error()

exit 0 ;

<br>\n );

/ / выполнение запроса

$Query = INSERT INTO object (Data) .

VALUES ( . serialize($home) . ) ; if(!($dbResult = mysql query($Query, $dbLink)))

print( Could not execute query!<br>\n ); print(mysql errno() . : . mysql error() exitO;

<br>\n );

определение идентификатора объекта $oid = mysql insert id();

извлечение объекта из базы данных

$Query = SELECT Data FROM object WHERE lD=$oid ;

if(!($dbResult = mysql query($Query, $dbLink)))

not execute

print (mysql errno () . : . mysql e.rror () . <br>\n ); exitO ;



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

?>

$row = inysql fetch row ($dbResult) ;

$h = unserialize($row[0]);

добавление еще одной комнаты $h->addRooni(new Room ( bathroom ) ) ;

определение названия второй комнаты $г = $h->getRoom(l); print($r->getName());

После того как объект был сохранен в базе данных, он немедленно извлекается и в него добавляются сведения еще об одной комнате. Последние несколько строк сценария демонстрируют, что методы объекта остались неизменными. Если запустить сценарий, то можно убедиться, что функция print () отображает строку bedroom . Интерпретатор РНР не кодирует методы в сериализованном объекте. Кодируются лишь свойства, а также имя класса. После восстановления объекта интерпретатор проверяет имя класса и делает доступными его методы.

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

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

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

Методы классов не имеют эквивалентов в базеданных. Они остаются элементами программного кода, что создает тесную связь между информацией, хранимой в базе данных, и классами приложения. Это не проблема, если все приложения придерживаются единого интерфейса доступа к данным. Проблема возникает при непосредственном обновлении данных с помощью SQL или другой программной среды. Например, объект может ограничивать значения числового свойства диапазоном от 0,0 до 100,0, но в MySQL столбцы типа FLOAT имеют гораздо более широкий диапазон. Если забыть о существующем ограничении, то, выполняя инструкцию UPDATE, можно легко нарушить целостность столбца. Необходимость учитывать подобного рода ограничения приводит к существенному усложнению работы с объектами.

В общем случае требуется, чтобы для каждого постоянного объекта существовали методы чтения, записи и удаления. Если набор объектов невелик, создать необходи-



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

Основная проблема в этой простой методике- огромный объем SQL-кода, встраиваемого в каждый объект. Возникает слишком тесная связь между приложением и базой данных. Когда в класс добавляется новое свойство, приходится менять схему базы данных. Решением проблемы является уже упоминавшийся уровень постоянства, инкапсулирующий код взаимодействия с базой данных. Функции этого уровня обеспечивают прозрачную работу с объектами, генерируя все необходимые инструкции SQL.

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

На рис. 30.2 приведена UML-диаграмма двух классов: Building и Room. Связь один ко многим отражает тот факт, что в каждом здании есть какое-то число комнат. В простейшем случае одному классу соответствует одна таблица. Такая таблица может содержать столбцы, не сопоставленные свойствам класса. С их помощью реализуются отношения между таблицами.

Building

Содержит

Room

Name: Строка

Рис. ЗО.2. Диаграмма классов

На рис. 30.3 изображена диаграмма отношений между таблицами классов. Руководствуясь принципами, изложенными в главе 7, Проектирование баз данных , несложно догадаться, что таблицы Building и Room должны содержать це лочисленные первичные ключи, а таблица Room- еще и внешний ключ. Эти идентификаторы не важны с точки зрения использования объектов, но они необходимы для связи таблиц базы данных. Они также позволят приложению ассоциировать друг с другом объекты и записи таблиц. В листинге 30.3 показаны инструкции, требуемые для создания упомянутых таблиц.

Building

Room

Рис. 30.3. Диаграмма базы данных



1 ... 168 169 170 [ 171 ] 172 173 174 ... 201

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