Модель в ідеальному світі повинна містити лише ділову логіку, вона моделює якийсь реальний об'єкт, наприклад, Будинок. Однак майже в усіх обставинах моделі потрібно зберігати свої дані до деякого сховища.
Взаємодія між моделлю та збереженими даними може відбуватися або на окремому рівні даних, або безпосередньо в моделі, що є випадком використання 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, але на практиці це не має значення.