Модуль таблицы против модели домена - PullRequest
22 голосов
/ 12 января 2009

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

1 Ответ

34 голосов
/ 12 января 2009

Лучшим справочником является «Образцы архитектуры корпоративных приложений» Мартина Фаулера:

Вот выдержка из раздела «Настольный модуль»:

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

Table Module был бы особенно полезен в гибкой архитектуре базы данных, которую вы описали для данных своего профиля пользователя, в основном это Entity-Attribute-Value design.

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

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

$table->setUserProfile( $userid, array('firstname'=>'Kevin', 'lastname'=>'Loney') );

Аналогичным образом, запрос профиля данного пользователя будет использовать модуль таблиц для сопоставления нескольких строк набора результатов запроса с элементами объекта.

$hashArray = $table->getUserProfile( $userid );
...