Табличный модуль против модели предметной области

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
27
0
12 827
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучшая ссылка - это «Шаблоны архитектуры корпоративных приложений» Мартина Фаулера:

Вот выдержка из раздела Табличный модуль:

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 );

Спасибо, после значительного количества чтения и размышлений свет загорелся.

Kevin Loney 13.01.2009 10:19

Спасибо за отличное объяснение, в чем разница между ними.

Nikita Fedyashev 22.11.2009 20:32

@BillKarwin Должны ли сущности таблицы данных (определено на бизнес-уровне, BL), например Здесь "Пользователь" или "Профиль пользователя" есть какие-либо проблемы с доступом к данным? Например, если доступ к данным использует сопоставление на основе атрибутов для материализации объектов при доступе к данным. Должны ли объекты таблицы данных BL нести эти атрибуты? Разве это не соединило бы BL с особенностями доступа к данным? Я пытаюсь установить связь между BL и DAL в реализации табличного модуля.

Umair Ishaq 11.10.2013 23:14

@fallow, в конечном итоге у вас должен быть класс некоторый, который знает, как получить доступ к данным в том виде, в котором вы их храните. Помните, что цель создания «слоев» в ООП - сохранить гибкость при замене различных реализаций. Если в этом нет необходимости, то создание большего количества абстракций и слоев не имеет большого значения.

Bill Karwin 12.10.2013 00:18

@BillKarwin Большое спасибо за ваш комментарий. Чтобы было ясно, вы НЕ предлагая комбинировать BL и DAL, если гибкость не требуется. Вы НАХОДЯТСЯ предполагаете, что наличие этих атрибутов в объектах BL может быть подходящим компромиссом; верный?

Umair Ishaq 12.10.2013 01:12

@fallow, сложно сделать обобщение, не зная требований проекта. Но обычно класс BL использует объект DAL - предпочтение HAS-A перед IS-A.

Bill Karwin 12.10.2013 01:39

Другие вопросы по теме