Модель в идеальном мире должна содержать только бизнес-логику, она моделирует некоторый реальный объект, такой как дом. Однако почти во всех случаях модель должна сохранять свои данные в некотором хранилище.
Взаимодействия между моделью и сохраненными данными могут происходить либо на отдельном слое данных, либо непосредственно в модели, что имеет место при использовании ORM (Object Relational Mapper). Другими словами, либо модель подключается напрямую к базе данных, либо передает свои данные в какой-то другой объект «доступа к данным», который подключается к базе данных.
ORM (Object Relation Mapper) сопоставляет поля в таблице базы данных с атрибутами вашего объекта модели, предоставляя методы получения и установки. В этом случае нет отдельного слоя данных, и модель несет прямую ответственность за сохранение своих данных.
Вот пример Ruby с ActiveRecord
использованием популярного ORM:
class House < ActiveRecord::Base
end
house = House.new
house.price = 120000
house.save
Price
это поле в houses
таблице, которое автоматически определяется с помощью ActiveRecord
которого к объекту добавляются методы получения и установки. Когда save
вызывается, значение атрибута цены сохраняется в базе данных.
С моей точки зрения преимущество наличия уровня данных состоит в том, что вы получаете точку, в которой вы можете манипулировать данными, прежде чем они попадут в модель, модель меньше беспокоится, у нее меньше обязанностей. Например, вам может потребоваться объединить данные из нескольких несовместимых источников данных, это то, что ORM не может легко обработать.
Основным недостатком является еще один уровень абстракции для управления, если вам это не нужно, не беспокойтесь, будьте проще. Меньше движущихся частей, меньше ошибаться.
I'm not using the database as a simple object store
, Я предполагаю, что это означает некоторую бизнес-логику в базе данных в форме хранимых процедур. В теории это идет вразрез с MVC, но на практике это не имеет значения.