MySQL. Библиотека профессионала - Аткинсон Л
..pdfсвязи 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
этой
•Библиотека функций отладки
•Создание наборов символов
•Создание функций
•Создание процедур