7. KpuTuK,То что ты показываешь, это ActiveRecord, более простое решение, не являющееся ORM. ORM это DataMapper.
Вариантов несколько, объясню на примере моего. Для реализации ORM (как правило) нужно решить две задачи: ассоциативность и наследование. Другими словами как сохранять в базе единичные и множественные ссылки на объекты и как сохранять в базе наследование классов.
По первому вопросу нужно решить задачу уникальности объектов и преобразование объектов в уникальные ссылки. По второму вопросы есть решение либо на уровне одной таблицы, либо на уровне нескольких.
Теперь по каждому подробнее:
Уникальность объектов
Решается довольно просто. Реализуем интерфейс, на пример OID, который определяет методы setOID, getOID, getProxy и т.д. Те классы, которые реализуют уникальные объекты, должны реализовать этот интерфейс, а интерфейс определяет объекты, которые можно идентифицировать по некоторому уникальному свойству OID (на пример целочисленный идентификатор).
Создание ссылок
Тут тоже все просто. Есть объект с OID, для создания ссылки на него достаточно знать OID и имя класса этого объекта. Реализуем метод getLink который возвращает запись вида $имяКласса:OID. Если в будущем система встретит в базе такую строку, значит это ссылка на объект класса имяКласса с идентификатором OID и его легко восстановить.
Наследование на уровне одной таблицы
Это простое решение задачи. Есть класс B который наследуется от класса A. Для хранения обоих классов используется одна таблица. Если нужен класс C от класса B, нужно расширить таблицу. Нарушение 1 нормальной формы.
Наследование на уровне иерархии таблиц
Сложная задача. Нужно сделать так, чтобы один класс был в одной таблице, а другой в другой таблице, даже если они в одной иерархии наследования.
Изменил: Артур (09.11.2013 / 15:24)