in Zend, Warum verwenden wir DB Model Klasse und Mapper Klasse als zwei separate?

7

Ich arbeite am Zend-Projekt, ich beziehe mich auf ein anderes Zend-Projekt, um das neue Zend-Projekt zu erstellen. Aber ich mag es nicht, blindlings diesem Projekt zu folgen, ohne es zu verstehen. In der Zend Directory-Struktur gibt es in der Model-Klasse hauptsächlich zwei Arten von Klassen, die ich sehe, wie in

%Vor%

Warum wird diese spezifische Struktur befolgt? Soll das die Objektklasse und die Datenbankmodellklasse trennen?

Bitte erläutern.

    
Rajan Rawal 17.02.2012, 14:21
quelle

2 Antworten

12

DataMapper ist ein Entwurfsmuster aus Mustern der Enterprise Application Architecture .

  

Der Data Mapper ist eine Softwareschicht, die die speicherinternen Objekte von der Datenbank trennt. Ihre Aufgabe besteht darin, Daten zwischen den beiden zu übertragen und sie voneinander zu isolieren. Mit Data Mapper müssen die In-Memory-Objekte nicht einmal wissen, dass eine Datenbank vorhanden ist. Sie benötigen keinen SQL-Schnittstellencode und sicherlich keine Kenntnisse des Datenbankschemas.

Wie Sie Daten in einer relationalen Datenbank speichern, ist normalerweise anders als bei der Strukturierung von Objekten im Speicher. Zum Beispiel wird ein Objekt ein Array mit anderen Objekten haben, während in einer Datenbank Ihre Tabelle stattdessen einen Fremdschlüssel zu einer anderen Tabelle hat. Aufgrund der objektrelationalen Impedanzabweichung verwenden Sie eine vermittelnde Schicht zwischen dem Domänenobjekt und der Datenbank. Auf diese Weise können Sie beide weiterentwickeln, ohne die anderen zu beeinflussen.

Das Trennen der Mapping-Verantwortung in einer eigenen Ebene folgt ebenfalls dem Prinzip der einfachen Verantwortlichkeit . Ihre Objekte müssen nicht über die DB-Logik und umgekehrt wissen. Dies gibt Ihnen mehr Flexibilität beim Schreiben Ihres Codes.

Wenn Sie kein Domänenmodell verwenden möchten, benötigen Sie normalerweise keinen DataMapper. Wenn Ihre Datenbanktabellen einfach sind, sind Sie mit einem TableModule und TableDataGateway oder sogar nur ActiveRecord besser dran.

Für verschiedene andere Muster siehe meine Antwort auf

Gordon 17.02.2012, 14:29
quelle
6

Die Idee eines Modells besteht darin, die logische Sammlung von Daten innerhalb Ihres Codes zu schließen.

Die Idee eines DataMappers besteht darin, diese Sammlung von Daten auf Anwendungsebene mit der Art der Speicherung zu verknüpfen.

Bei vielen ActiveRecord-Implementierungen bietet das Framework diese Trennung der Absicht nicht, was zu Problemen führen kann. Zum Beispiel kann ein BlogPost-Modell die grundlegenden Informationen eines Blogposts wie

einpacken
  • Titel
  • Autor
  • Körper
  • date_posted

Aber vielleicht möchten Sie auch, dass es etwas enthält wie:

  • Anzahl_der_Reads
  • Anzahl_von_Liehnen

Nun könnten Sie all diese Daten zunächst in einer einzigen MySQL-Tabelle speichern, aber wenn Ihr Blog wächst und Sie sehr berühmt werden, stellen Sie fest, dass Ihre Statistikdaten sehr viele Treffer benötigen und Sie sich bewegen möchten es auf einen separaten Datenbankserver.

Wie würden Sie diese Felder der BlogPost-Objekte in einen anderen Datenspeicher migrieren, ohne den Anwendungscode zu ändern?

Mit dem DataMapper können Sie ändern, wie das Objekt in den Datenbanken gespeichert wird und wie es aus den Datenbanken geladen wird. Auf diese Weise können Sie den Speichermechanismus optimieren, ohne die tatsächliche Sammlung von Informationen ändern zu müssen, auf die Ihre Anwendung angewiesen ist.

    
Justin DeMaris 17.02.2012 14:30
quelle