Das Modell in einer idealen Welt sollte nur Geschäftslogik enthalten, es modelliert ein reales Objekt wie ein Haus. In fast allen Fällen muss das Modell seine Daten jedoch in einem gewissen Umfang speichern.
Interaktionen zwischen dem Modell und den gespeicherten Daten können entweder auf einer separaten Datenebene oder direkt im Modell stattfinden, was bei Verwendung eines ORM (Object Relational Mapper) der Fall ist. Mit anderen Worten, entweder stellt das Modell eine direkte Verbindung zur Datenbank her oder es übergibt seine Daten an ein anderes "Datenzugriff" -Objekt, das eine Verbindung zur Datenbank herstellt.
Ein ORM (Object Relation Mapper) ordnet Felder in der Datenbanktabelle den Attributen Ihres Modellobjekts zu und stellt Getter und Setter bereit. In diesem Fall gibt es keine separate Datenschicht und das Modell ist direkt für die Speicherung seiner Daten verantwortlich.
Hier ist ein Ruby-Beispiel mit ActiveRecord
einem beliebten ORM:
class House < ActiveRecord::Base
end
house = House.new
house.price = 120000
house.save
Price
ist ein Feld in der houses
Tabelle, das automatisch erkannt wird ActiveRecord
und das dem Objekt einen Getter und Setter hinzufügt. Wenn save
aufgerufen wird, bleibt der Wert des Preisattributs in der Datenbank erhalten.
Aus meiner Sicht ist der Vorteil einer Datenschicht, dass Sie einen Punkt erhalten, an dem Sie die Daten manipulieren können, bevor sie im Modell ankommen. Das Modell hat weniger Sorgen, es hat weniger Verantwortlichkeiten. Beispielsweise müssen Sie möglicherweise Daten aus mehreren nicht kompatiblen Datenquellen kombinieren. Dies ist etwas, das ein ORM nicht einfach handhaben kann.
Der Hauptvorteil ist eine weitere Abstraktionsebene, die verwaltet werden muss. Wenn Sie sie nicht benötigen, kümmern Sie sich nicht darum, sie einfach zu halten. Weniger bewegliche Teile, weniger Fehler.
I'm not using the database as a simple object store
. Ich vermute, das bedeutet eine gewisse Geschäftslogik in der Datenbank in Form von gespeicherten Prozeduren. In der Theorie geht das gegen MVC, aber in der Praxis spielt es keine Rolle.