Модель в ідеальному світі повинна містити лише ділову логіку, вона моделює якийсь реальний об'єкт, наприклад, Будинок. Однак майже в усіх обставинах моделі потрібно зберігати свої дані до деякого сховища.
Взаємодія між моделлю та збереженими даними може відбуватися або на окремому рівні даних, або безпосередньо в моделі, що є випадком використання 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якого додається об’єкт getter та setter. Коли saveназивається, значення цінового атрибута зберігається в базі даних.
З моєї точки зору, про наявність рівня даних полягає в тому, що ви отримуєте точку, в якій можете маніпулювати даними, перш ніж потрапляти до моделі, модель менше турбується про неї, має менше обов'язків. Наприклад, вам може знадобитися об'єднати дані з кількох не сумісних джерел даних, це те, з чим ORM не може легко впоратися.
Основний мінус - це ще один шар абстракції для управління, якщо він вам не потрібен, не турбуйтеся, нехай це буде просто. Менше рухомих деталей, менше помилок.
I'm not using the database as a simple object store. Я здогадуюсь, що це означає деяку логіку бізнесу в базі даних, у вигляді збережених процедур. Теоретично це суперечить MVC, але на практиці це не має значення.