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

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

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

522 Глава 29. базы данных

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

GRANT SHUTDOWN ON

ТО IDENTIFIED BY

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

 

=

user

 

password

password

log

 

socket

 

port

3306

socket

 

port

3307

pid file

 

datadir

 

user

socket

 

port

3308

pid file

 

datadir

user

РАБОТА С ОБЪЕКТАМИ

этой

Объектно ориентированная модель

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

главе рассказывается о том, как использовать в базах данных MySQL. модель пытается отражать сущности ре ального мира с помощью структур данных. Не существует простого способа ус тановить соответствие между объектами и таблицами реляционных баз данных. Ре шением этой проблемы занимаются уже не один год. В настоящее время наиболее по пулярной методикой является так называемый уровень постоянства (persistence layer). Это особый набор функций, обеспечивающих преобразование данных при их пере даче между приложением и базой данных. Большинство реализаций методики вано на работах Скотта (Scott Ambler). Он публикует многочисленные статьи

и спецификации на своем Web узле

Компания (www.sourceforge.net) ведет несколько открытых проектов, посвященных реализации уровней постоянства. Наиболее популярный среди них — проект (http://osage.sourceforge.net). Программистов, работающих на языке Perl, заинтересует проект (www.soundobjectlogic.com/tangram). Компания Sun разра ботала интерфейс (Java Data объекты данных Java), обеспечивающий прозрачный доступ к объектам базыданных.

В этой главе будут описанылишь основные концепции объектно ориентирован ной модели и рассмотрены решения, имеющиеся в программе MySQL. Приводимые примеры сценариев написаны на

Объектно ориентированная модель

В модели структуры данных называются объектами. Они имеют свойства и методы. Свойства— это отдельные атрибуты объекта. У каждо го свойства есть имя и значение в строго заданном диапазоне. Например, у объекта может быть свойство "Age" (возраст), содержащее неотрицательное целое число. На бор значений всех свойств определяет состояние объекта. Методы— это выполняемые объектом. Как и функция, метод принимает список аргументов и воз вращает значение.

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

Методы и свойства могут быть открытыми либо закрытыми. Открытые методы разрешается вызывать кому угодно, тогда как вызов закрытого метода может осуще ствить лишь сам объект. То же самое относится и к свойствам.

Объект представляет собой уникальный экземпляр класса. Класс содержит опре деления методов и свойств и является своего рода шаблоном объектов. Таким обра зом, термины "объект" и "класс" представляют собой разные понятия.

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

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

Представим, к примеру, что существует метод

предназначенный

для вычисления скорости объекта. Неизвестно

заранее, к какому именно объекту в

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

метод. Если это объект класса

(автомобиль), скорость вычисляется в километрах в час. Если же это объект класса Computer (компьютер), скорость вычисляется в мегагерцах.

Здесь упомянута важнейшая особенность полиморфных объектов: они способны принимать "облик" любого из родительских классов. Рассмотрим рис. 30.1. В этой ие

рархии существует класс Sedan (седан), порождающийся от класса

который, в

свою

наследует класс Vehicle

(транспортное средство). Поскольку класс

Sedan тоже является потомком класса

объект класса Sedan можно исполь

зовать везде, где допустим класс Vehicle. Например, у транспортного средства есть определенное число колес. Предположим, в классе Vehicle создан метод возвращающий число колес объекта. Для автомобиля метод вернет значение 4, а для велосипеда— 2. Оба класса, и Bicycle, наследуют метод от родительского класса Vehicle.

Рис. Иерархия наследования

объектов 527

объектов

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

Для хранения объектов удобно применять столбцы типа TEXT. В листинге приведена инструкция CREATE TABLE, создающая таблицу таких объектов.

CREATE TABLE object

ID INT NOT NULL AUTO_INCREMENT,

Data TEXT,

PRIMARY

В листинге 30.2демонстрируется Сериализация объекта на языке В сценарии определяются два класса: Building (здание) и Room (комната). В объект home класса добавляются два объекта класса Room, после чего объект home сохраняется в таблице Функция serialize преобразует содержимое объекта в длин ную строку, которая записывается в столбец Data.

<?php

класс зданий class Building

массив комнат var

functiongetRoom($id)

function

класс class Room

var

конструктор

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

function

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

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

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

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

not connect to

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

not select

exit

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

$Query "INSERT INTO object (Data)

not execute

определение идентификатора объекта $oid

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

= "SELECT Data FROM object WHERE

not execute

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

$row

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CREATE TABLE Building

ID INT NOT NULL

Name

NOT NULL,

PRIMARY

 

CREATE TABLE Room

ID INT NOT NULL

Building INT NOT NULL,

Name

NOT NULL,

PRIMARY

 

FOREIGN KEY

(Building) REFERENCES

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

<?php

class Building

var $id; var $dbLink;

function

$this >dbLink $this >id $this >room

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

function

0)

извлечение данных из таблицы Building