Welcher Ansatz in DataMapper Pattern ist für mehrere oder verknüpfte Tabellen besser?

8

Normalerweise ordnet ein Data Mapper Daten einer bestimmten Tabelle zu. (Theoretisch sollte es zwischen Speicher und einem Domänenobjekt kommunizieren, aber in meinem Fall ist dies nicht möglich, sodass ich direkt mit Tabellen kommuniziere.)

Table1Mappper> Table1

Wenn für diese Tabelle jedoch Daten aus einer anderen Tabelle verknüpft werden müssen, erweitern Sie den Bereich Ihres Data Mapper, der nur für die Zuordnung aus einer Tabelle vorgesehen war.

Table1Mapper> Table1: Inner-Join: Table2

Wäre es nicht besser, wenn Table2 einen eigenen Mapper hätte, Table2Mapperum seine Daten abzubilden ?

Wenn Sie denken Yes, wenn Sie eine Liste von Datensätzen aus Table1Mapper anzeigen und später Table2Mapper verwenden möchten, um die Daten abzurufen, die verbunden werden sollten, führen Sie eine Abfrage in einer Schleife aus, was auch nicht gut ist.

Was sind Ihre Erkenntnisse auf diesem Weg?


Eine andere Möglichkeit besteht darin, Ihren Mapper so zu ändern, dass er Untertabellen verarbeitet.

class Table1Mapper {
    public main_table = 'table1';
    public sub_table1 = 'table2';
}

Was ich für in Ordnung halte, aber nur, bis der Umfang des gesamten Mappers eine bestimmte Entität in der Anwendung behandelt. Zum Beispiel postund post_author. Wenn der Umfang jedoch anders ist als postund gallery, ergibt das oben Gesagte keinen idealen Daten-Mapper. Um dies zu veranschaulichen

class PostMapper {
     public table_name = 'tbl_post';
     public gallery_table_name = 'tbl_gallery';
}

Ist das nicht richtig? Sie möchten jedoch die Galerien eines Posts in einer Abfrage abrufen, da das Hinzufügen eines Abfrage-Overheads in einer Schleife keine gute Lösungsleistung darstellt.

Was ist Ihrer Meinung nach der richtige Weg, um dies in DataMapper Pattern / oder einem anderen Muster zu lösen, wenn es eine bessere Möglichkeit gibt, solche Fälle zu behandeln?

Starx
quelle

Antworten:

5

Mit Data Mapper meinen Sie einen von Martin Fowler beschriebenen , oder? Es ist eines der Muster für Architekturmuster von Datenquellen. Andere sind:

Data Mapper unterscheidet sich von anderen Mustern hinsichtlich der Beziehung zwischen Objekten und Tabellen. Sowohl das Data Gateway-Muster als auch das Active Record-Muster setzen eine fast eins zu eins Zuordnung von Tabellen zu Objekten voraus.

Schauen wir uns ein Beispiel an:

table BANK_ACCOUNT
   ID

table BANK_ACCOUNT_BALANCE
   ID
   BANK_ACCOUNT_ID
   BALANCE_AMOUNT
   DATE

Domänenobjekte sind dann:

class BankAccount {
    long id;
}

class BankAccountBalance {
    long id;
    long bankAccountId;
    Decimal balanceAmount;
    Date date;
}

Wie Sie sehen, ist die Zuordnung zwischen Klassen und Tabellen eins zu eins. Es gibt auch zwei verschiedene Tabellen- / Zeilendaten-Gateways oder aktive Datensätze - einen für jede Tabelle.

Im Gegensatz dazu ermöglicht Data Mapper die Indirektion :

Eine Ebene von Mappern (473), die Daten zwischen Objekten und einer Datenbank verschiebt, während sie unabhängig voneinander und vom Mapper selbst bleiben.

Wenn Sie Data Mapper verwenden, können sich Ihre Objekte von Datenbanktabellen unterscheiden. Sie können die Aggregation einführen, Verknüpfungen mit anderen Tabellen herstellen, arithmetische Operationen ausführen und Vererbungshierarchien einführen. Beantworten Sie also Ihre Frage - es ist vollkommen in Ordnung, zwei Tabellen in Data Mapper zu verknüpfen, solange das Ergebnisobjekt ein gültiges Domänenobjekt ist.

In unserem Beispiel könnten wir haben:

class BankAccount {
    long id;
    Decimal latestBalance;
    Date latestBalanceDate;
}

als Domänenobjekt, das von einem einzelnen Data Mapper basierend auf JOIN und Aggregation zurückgegeben wird.

Daher eignet sich Data Mapper perfekt für die Darstellung eines nicht trivialen Domänenmodells. Wenn Ihr Domänenmodell recht einfach ist, können Sie das Active Record-Muster oder Data Gateways verwenden.

Bedarf an JOINs Data Mapper kann manchmal (muss aber nicht) anzeigen, dass die Domänenklasse zu komplex ist. Bitte überprüfen Einzel Prinzip Verantwortung , Interface - Segregations Prinzip .

In Domain-Driven Design haben Domänenklassen (dh die von Data Mapper zurückgegeben werden) die Form von Entitäten oder Wertobjekten. Das DDD-Buch beschreibt ziemlich gut, woraus eine Entität bestehen sollte. Vielleicht möchten Sie dies überprüfen.

Zusätzlich DDD definiert Aggregate (ziemlich gut beschrieben hier ). Sie werden oft zusammen geladen. Das Verknüpfen von zwei Tabellen könnte darauf hindeuten, dass zwei Entitäten in einem Aggregat vorhanden sind.

Dawid Pytel
quelle
Vielen Dank. Meine einzige Sorge war, dass verschiedene Tabellen, obwohl sie miteinander verwandt sind, von ihrem individuellen Mapper verwaltet werden könnten. Wenn ein anderer Mapper einen Teil davon ausführt, weil die Daten verwandt sind, wird die Logik zum Verwalten oder Abstrahieren der Daten des verwandten Mappers auf zwei Mapper aufgeteilt. Dies ist, was sich anfühlt wie "Das könnte besser gemacht werden".
Starx