На днях я спросил о Выбор метода хранения профилей пользователей и получил интересный ответ Дэвида Томаса Гарсиа, предлагающий использовать шаблон проектирования Table Module. Похоже, я хочу пойти именно в этом направлении. Все, что я обнаружил с помощью Google, кажется довольно высокоуровневым обсуждением, поэтому, если бы кто-нибудь мог указать мне в направлении некоторых примеров или дать мне лучшее представление о задействованных гайках и болтах, это было бы здорово.

Лучшая ссылка - это «Шаблоны архитектуры корпоративных приложений» Мартина Фаулера:
Вот выдержка из раздела Табличный модуль:
A Table Module organizes domain logic with one class per table in the database, and a single instance of a class contains the various procedures that will act on the data. The primary distinction with Domain Model is that, if you have many orders, a Domain Model will have one order object per order while a Table Module will have one object to handle all orders.
Модуль таблиц был бы особенно полезен в гибкой архитектуре базы данных, которую вы описали для данных вашего профиля пользователя, в основном в дизайне Сущность-Атрибут-Значение.
Обычно, если вы используете модель предметной области, каждая строка в базовой таблице становится одним экземпляром объекта. Поскольку вы храните информацию профиля пользователя в нескольких строках, вам придется создавать множество объектов модели предметной области, тогда как на самом деле вам нужен один объект, который инкапсулирует все свойства пользователя.
Вместо этого модуль таблицы упрощает кодирование логики, которая применяется к нескольким строкам в базовой таблице базы данных. Если вы создаете профиль для данного пользователя, вы должны указать все эти свойства, и класс Table Module будет иметь код для преобразования этого в серию операторов INSERT, по одной строке на свойство.
$table->setUserProfile( $userid, array('firstname'=>'Kevin', 'lastname'=>'Loney') );
Точно так же при запросе профиля данного пользователя будет использоваться модуль таблицы для сопоставления нескольких строк набора результатов запроса с членами объекта.
$hashArray = $table->getUserProfile( $userid );
Спасибо за отличное объяснение, в чем разница между ними.
@BillKarwin Должны ли сущности таблицы данных (определено на бизнес-уровне, BL), например Здесь "Пользователь" или "Профиль пользователя" есть какие-либо проблемы с доступом к данным? Например, если доступ к данным использует сопоставление на основе атрибутов для материализации объектов при доступе к данным. Должны ли объекты таблицы данных BL нести эти атрибуты? Разве это не соединило бы BL с особенностями доступа к данным? Я пытаюсь установить связь между BL и DAL в реализации табличного модуля.
@fallow, в конечном итоге у вас должен быть класс некоторый, который знает, как получить доступ к данным в том виде, в котором вы их храните. Помните, что цель создания «слоев» в ООП - сохранить гибкость при замене различных реализаций. Если в этом нет необходимости, то создание большего количества абстракций и слоев не имеет большого значения.
@BillKarwin Большое спасибо за ваш комментарий. Чтобы было ясно, вы НЕ предлагая комбинировать BL и DAL, если гибкость не требуется. Вы НАХОДЯТСЯ предполагаете, что наличие этих атрибутов в объектах BL может быть подходящим компромиссом; верный?
@fallow, сложно сделать обобщение, не зная требований проекта. Но обычно класс BL использует объект DAL - предпочтение HAS-A перед IS-A.
Спасибо, после значительного количества чтения и размышлений свет загорелся.