Как бы вы смоделировали это приложение? - PullRequest
6 голосов
/ 04 февраля 2010

У меня есть приложение MVC, написанное для Zend Framework, которое извлекает данные из базы данных Oracle 10g, отображает эти данные в таблицах и списках и визуально обогащает эти данные с помощью цветов и диаграмм.Там нет ORM и не создавать, обновлять или удалять, просто чтение.Данные вставляются из другого приложения.Данные в БД смоделированы по понятиям, которые они представляют и к которым имеют доступ представления БД, которые объединяют эти данные из различных других таблиц (устаревшие, не могут изменяться), например,

| Event ID | Start               | End                 | Status | Created_By |
-----------------------------------------------------------------------------
| 12345678 | 2009-10-01 12:00:00 | 2009-10-01 12:15:00 | booked | John Doe   |
| 12345679 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | booked | John Doe   |
| 12345680 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | tba    | Jane Doe   |

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

Мой текущий подход работает примерно так:

Request --> Controller
            | <--> sanitizes and returns Request params
            | ---> Facade (capsules steps to fetch View Data)
            |      | <--> Table Data Gateway builds Query for requested View
            |      | <--> Query Decorator¹ applies User/Client settings
            |      | <--> DB Adapter fetches RecordSet from decorated Query
            | <----returns Recordset
            | <--> applies RecordSet to View
            | <--> Data-Aware ViewHelper render RecordSet (and View)
Response <--returns rendered View

¹ Query Decorator может читать в постоянных настройках пользователя / клиента и добавлятьэто к базовому объекту Query, возвращенному TDG на лету.

Однако в последнее время я сомневаюсь в этом подходе и хочу улучшить его.Я думаю, я мог бы полностью удалить TDG и сделать здание View полностью универсальным из пользовательского интерфейса;основываясь только на структуре БД.Пользователям наверняка понравится это.Дело в том, что View должен знать много о данных.ViewHelpers должен знать имена столбцов для обогащения данных, и часто они делают это в отношении нескольких столбцов в наборах записей.Они не могут быть общими, и что-то подсказывает мне, что это проблема.Это похоже на мешанину.Я просто не могу точно определить, почему.

Любые модели, идеи - и мнения - с благодарностью.Я знаю, что вопрос несколько расплывчатый, но, как я уже сказал, я не могу точно определить, что заставляет меня сомневаться в этом подходе.Поэтому я думаю, что мне нужны подходы с хорошей практикой для создания настраиваемых пользовательских и клиентских приложений, ориентированных на базы данных.Мне, конечно, не нужно решение, просто некоторые идеи и, возможно, несколько ссылок, чтобы увидеть, как другие люди подходят к этой проблеме, поэтому я могу принять это во внимание при следующем рефакторинге.

Примечание
Я оставлю вопрос открытым до полного ответа, прежде чем принять ответ.Любой вклад приветствуется.

Ответы [ 3 ]

13 голосов
/ 07 февраля 2010

Перечитав ваш вопрос несколько раз и немного подумав, я думаю, что суммировал бы ситуацию следующим образом:

М "отсутствует" в вашем "MVC".

На данный момент вы создали схему реляционной базы данных вручную, так что она имеет отображение 1: 1 с вашей моделью домена.И это здорово, это делает сопоставление очень простым, но набор записей все еще не является классом домена.

Термин Модель в контексте MVC относится к модели домена , а не реляционная модель .Если у вас есть реляционная база данных, поддерживающая это приложение, то вам нужно какое-то отображение.Это не значит, что вам нужна полноценная платформа ORM, такая как Doctrine - хотя я нахожу, что эти инструменты значительно облегчают мою жизнь, даже для небольших проектов - но вам нужно что-то .На самом деле Zend Framework даже подробно описывает отображение модели домена в Quick Start .

Я не думаю, что вам нужно удалять TDG.Абстракции хороши.Я хотел бы сравнить его с тем, чтобы сделать ваше приложение немного более компактным, и пойти в офисное здание и разорвать телефонную систему на том основании, что сотрудники могут просто использовать свои мобильные телефоны.Они могут , но вы не хотите их, точно так же, как вы не хотите, чтобы ваши представления бросали запросы SQL непосредственно в базу данных.Это неэффективно и, как правило, трудно управляемо.

Моя версия архитектуры будет выглядеть следующим образом:

Request --> Controller
            | <--> sanitizes and returns Request params
            | ---> Facade (encapsulates steps to fetch View Data)
            |      | <--> Table Data Gateway builds Query for requested View
            |      | <--> Query Decorator applies User/Client settings
            |      | <--> DB Adapter fetches RecordSet from decorated Query
***         |      | <--> Mapping layer converts RecordSet to Domain Model
***         | <----returns Model
***         | <--> applies Model to View
***         | <--> Data-Aware ViewHelper render Model (and View)
Response <--returns rendered View

Я пометил строки изменений как ***.Действительно, единственное, что я изменил, это то, что вместо того, чтобы собирать набор записей с фасада, он выбирает модель (вероятно, массив классов домена) и применяет , что , к представлению.

Вместо таких терминов, как $row['Status'] в вашем View [Helper], у вас будет $event->status, что безопаснее и проще в долгосрочной перспективе.Там нет названия столбца, только свойство.

Теперь вы прямо упомянули в самом верху своего вопроса, что у вас нет ORM, поэтому я думаю, что вы, вероятно, знаете о большей части этого и, возможно,просто нужен толчок.Вероятно, эти ноющие сомнения в вашем уме имеют вид: Что, если он не всегда доступен только для чтения?Что если модель данных станет более сложной?Что, если люди начнут запрашивать более сложные отчеты?

Все это является причиной, по которой у вас есть модель предметной области, почему она фактически является фундаментальным строительным блоком MVC: в конечном счете, ментальная модель вашейу пользователей будет не синхронизироваться с моделью данных по ряду причин, о которых я не буду здесь говорить.Дело в том, что это почти всегда происходит.

Я уверен, что это необходимо?Я уверен, что это не просто излишество, куча ритуальных заклинаний, которые не имеют смысла для такого маленького проекта?

Нет, я не такой.Только вы можете решить это.Что я могу сказать вам, так это то, что парадигма MVC как специфической архитектуры не принесет вам большой пользы без правильной доменной модели.Это немного лучше, но не , что намного лучше, чем просто наличие встроенных запросов или фасадных вызовов на каждой странице.Без модели MVC - это не более, чем причудливая схема перезаписи URL.

Может быть, вам нужен этот уровень абстракции, а может и нет;но я предполагаю, что вы, вероятно, подозреваете, что могли бы, иначе вы бы не задали вопрос.Подумайте об этом, проанализируйте текущие требования и область применения, спросите себя, какие изменения вероятны, и если текущая архитектура кажется слишком хрупкой, чтобы приспособиться к этому, тогда следующим логическим шагом будет модель предметной области - даже если сегодня это просто точное зеркало реляционной модели.Завтра это может быть не так.

Надеюсь, что это именно тот ответ, который вы искали!

0 голосов
/ 07 сентября 2010

Для динамического получения данных из таблицы на основе пользовательского ввода вы можете использовать сетку данных компонентов Zend_Dojo.Вы можете создать один объект TDG, который будет преобразован в новую таблицу на основе пользовательского ввода.

http://zendguru.wordpress.com/2009/01/08/dojo-grid-in-zend-framework-creating-nice-and-cool-grid-in-php-using-zend-framework-and-dojo/

0 голосов
/ 04 февраля 2010

Дизайн схемы БД предъявляет различные требования (производительность запросов / записи, масштабируемость), как приятный пользовательский интерфейс (хороший поток страниц, поддерживающий работу людей или работу процессов).Поэтому довольно часто подход к пользовательскому интерфейсу и базе данных трудно сопоставить напрямую.

В качестве плохого примера я помню приложение, использующее «Oracle Forms», которое непосредственно представляло общее представление из структуры базы данных.Для неопытных людей это часто было очень нелогичным в использовании.

Тем не менее я думаю, что в вашем случае, если представление может быть напрямую сопоставлено со схемой БД, обязательно избавьтесь от ненужных уровней абстракции, кода иупростить систему.Реализуйте требования как можно проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...