Как Вы смоделировали бы это приложение?

Мне записали приложение MVC с Платформой Зенда, которая вытягивает данные из базы данных Oracle 10g и отображает эти данные в Таблицах и Списках и визуально обогащает эти данные через цвета и диаграммы. Нет никакого ORM, и не Создайте, Обновление или Удалите включенный, просто чистое Чтение. Данные вставляются из другого приложения. Данные в DB смоделированы после понятий они представляют и получили доступ Представлениями DB, что агрегат эти данные из различных других таблиц (наследие, не может измениться), например.

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

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

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

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

¹ Декоратор Запроса может читать в сохраненных настройках User/Client и добавить его к основному объекту Запроса, возвращенному TDG на лету.

Однако в последнее время я сомневался относительно этого подхода и хочу улучшить его. Я предполагаю, что мог удалить TDGs полностью и сделать Представление, создающее полностью универсальный из UI; на основе одной только структуры DB. Пользователи, конечно, хотели бы это. Вещь, Представление должно знать много о данных. ViewHelpers должны знать имена столбцов для обогащения данных, и часто они делают так в отношении нескольких столбцов в Recordsets. Они не могут быть универсальными, и что-то мне подсказывает, что это - проблема так или иначе. Похоже на путаницу. Я просто не могу точно определить почему.

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

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

6
задан Gordon 7 February 2010 в 13:21
поделиться

2 ответа

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

Буква «M» отсутствует в вашем «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

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

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

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

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

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

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

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

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

13
ответ дан 8 December 2019 в 18:36
поделиться

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

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

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

0
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: