В Zend, почему мы используем класс DB Model и класс Mapper как два отдельных?

StackOverflow https://stackoverflow.com/questions/9329881

Вопрос

Я работаю над проектом Zend, я имею в виду другой проект Zend, чтобы создать новый проект Zend. Но я не люблю слепо следить за этим проектом без понимания. В структуре каталога Zend, в классе модели есть в основном два типа класса, которые я вижу, как в

- models
   - DbTables
        - Blog.php  //Extends Zend_Db_Table_Abstract
   - Blog.php       // Contains methods like validate() and save()
   - BlogMapper.php // Also Contains methods like validate(Blog b) & save(Blog b)

Почему эта конкретная структура соблюдается? Это разделение класса объектов и класса модели базы данных?

Пожалуйста, объясни.

Это было полезно?

Решение

DataMapper - это дизайн -шаблон из шаблонов архитектуры корпоративного приложения.

Mapper Data-это уровень программного обеспечения, который отделяет объекты в памяти от базы данных. Его ответственность состоит в том, чтобы передавать данные между двумя, а также изолировать их друг от друга. С Mapper Data объекты в памяти не должны знать даже, что присутствует база данных; Они не нуждаются в коде интерфейса SQL, и, конечно, никаких знаний о схеме базы данных.

То, как вы храните данные в реляционной базе данных, обычно отличается от того, как вы структурируете объекты в памяти. Например, объект будет иметь массив с другими объектами, в то время как в базе данных ваша таблица будет иметь внешний ключ к другой таблице. Из -за несоответствие объектно-реляционного импеданса, Вы используете посредник между доменным объектом и базой данных. Таким образом, вы можете развиваться, оба без влияния на другого.

Разделение ответственности за картирование в своем собственном слое также более близко после Принцип единственной ответственности. Анкет Вашим объектам не нужно знать о логике DB и наоборот. Это дает вам большую гибкость при написании вашего кода.

Когда вы не хотите использовать доменную модель, вам обычно не нужен DataMapper. Если ваши таблицы базы данных просты, вам может быть лучше с помощью столовой и TableDatagateway или даже просто Activerecord.

Для различных других шаблонов видите мой ответ на

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

Идея модели состоит в том, чтобы завершить логическую коллекцию данных внутри вашего кода.

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

Для многих реализаций Activerecord эта структура не обеспечивает это разделение намерений, и это может привести к проблемам. Например, модель Blogpost может завершить основную информацию о блоге, подобном

  • заглавие
  • автор
  • тело
  • Дата Отправки

Но, может быть, вы также хотите, чтобы это содержало что -то вроде:

  • number_of_reads
  • number_of_likes

Теперь вы можете сохранить все эти данные в одной таблице MySQL для начала, но по мере роста вашего блога и вы становитесь очень известны Отдельный сервер базы данных.

Как бы вы пошли на перенос этих полей объектов BlogPost в другой хранилище данных, не изменяя код приложения?

С помощью DataMapper вы можете изменить способ, которым объект сохраняется в базе данных, и как он загружается из базы данных. Это позволяет настроить механизм хранения без необходимости изменить фактическую коллекцию информации, на которую опирается ваше приложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top