Model w idealnym świecie powinien zawierać tylko logikę biznesową, modeluje prawdziwy obiekt, taki jak Dom. Jednak w prawie wszystkich okolicznościach model musi utrwalić swoje dane do pewnego miejsca.
Interakcje między modelem a przechowywanymi danymi mogą zachodzić na osobnej warstwie danych lub bezpośrednio w modelu, co ma miejsce w przypadku korzystania z ORM (Object Relational Mapper). Innymi słowy, model łączy się bezpośrednio z bazą danych lub przekazuje dane do innego obiektu „dostępu do danych”, który łączy się z bazą danych.
ORM (Object Relation Mapper) mapuje pola w tabeli bazy danych na atrybuty obiektu modelu, udostępniając metody pobierające i ustawiające. W tym przypadku nie ma osobnej warstwy danych, a model jest bezpośrednio odpowiedzialny za utrwalenie swoich danych.
Oto Rubinowy przykład wykorzystujący ActiveRecord
popularny ORM:
class House < ActiveRecord::Base
end
house = House.new
house.price = 120000
house.save
Price
to pole w houses
tabeli, które jest automatycznie wykrywane, przez ActiveRecord
co dodaje obiekt pobierający i ustawiający do obiektu. Po save
wywołaniu wartość atrybutu ceny jest utrwalana w bazie danych.
Z mojego punktu widzenia zaletą posiadania warstwy danych jest to, że dostajesz punkt, w którym możesz manipulować danymi, zanim dotrze do modelu, model ma mniej powodów do zmartwień, ma mniej obowiązków. Na przykład może być konieczne połączenie danych z kilku niekompatybilnych źródeł danych, jest to coś, czego ORM nie może łatwo obsłużyć.
Główną wadą jest kolejna warstwa abstrakcji do zarządzania, jeśli jej nie potrzebujesz, nie zawracaj sobie głowy, zachowaj prostotę. Mniej ruchomych części, mniej błędów.
I'm not using the database as a simple object store
. Zgaduję, że to oznacza pewną logikę biznesową w bazie danych, w postaci procedur przechowywanych. Teoretycznie jest to sprzeczne z MVC, ale w praktyce nie ma to znaczenia.