2010-03-10 8 views

Antwort

3

Der Unterschied besteht in der Trennung Ihrer Domänenobjekte von der Datenzugriffsebene. Mit ActiveRecord ist alles ein Objekt, was es sehr einfach macht. Vor allem, wenn Ihre Klassen eins zu eins zu Ihrer Datenbank gehören. Data Mapper ist flexibler und ermöglicht es, dass Ihre Domain unabhängig von jedem Datenzugriffsinfrastruktur-Code getestet werden kann. Komplexität hat ihren Preis.

0

Ich muss zugeben, dass ich weiß nicht, Lehre oder Xyster aber ich kann zumindest einen kleinen Einblick in die Differenz zwischen Active Aufzeichnungen geben, wie in Ruby gegen ORMs wie SubSonic, Linq to SQL implementiert, nHibernate und Telerik. Hoffentlich gibt es dir zumindest etwas, das du weiter erkunden kannst.

Rubys Active Record ist seine nativen Datenzugriffsbibliothek - es ist nicht eine Abbildung aus einer vorhandenen SQL-Interface-Bibliothek (zum Beispiel .NET SqlDataTables) in die Konstrukte der Sprache - es ist die Interface-Bibliothek. Dies gab den Designern mehr Spielraum, um die Bibliothek in einer integrierten Weise zu erstellen, aber es erforderte auch, dass sie eine breite Palette von SQL-Tools implementieren, die Sie normalerweise nicht in einem ORM finden (zB DDL-Befehle sind ein Teil von Rubys Active Record-Schnittstelle)).

ORMs sind gemappt zu der zugrunde liegenden Datenbankstruktur mit einem manuellen Schritt, in dem ein Code-Generator eine Datenbank öffnen und durch sie - Gebäude Objekte entsprechend den Tabellen (und gespeicherten Prozeduren), die es findet, zu suchen. Diese Objekte werden unter Verwendung der Low-Level-SQL-Programmierkonstrukte konstruiert, die als Teil der Sprache angeboten werden (z. B. die .NET-System.Data.Sql- und SqlClient-Bibliotheken). Ziel ist es, rekorderelevanten relationalen Datenbanken beim Programmieren eine flüssigere und flüssigere Oberfläche zu geben: die "Impendanz-Mismatch" zwischen relationalem Modell und objektorientierter Programmierung zu reduzieren.

Als eine Randnotiz hat MS einen sehr "Active Record-like" Schritt beim Erstellen von nativen Sprachkonstrukten in C# über Linq zu SQL und Linq zu Entities genommen.

Hoffe, das hilft!

1

Der wesentliche Unterschied besteht darin, dass in DataMapper das Modell in der Ruby-Klasse definiert ist selbst:

class Post 
    include DataMapper::Resource 

    property :id,   Serial 
    property :title,  String 
    property :body,  Text 
    property :created_at, DateTime 
end 

Während in Active die Klasse meist eine leere Klasse ist und die framwork scannt die Datenbank. Dies bedeutet, dass Sie entweder eine vordefinierte Datenbank benötigen oder etwas wie Migrationen verwenden müssen, um das Schema zu generieren. Dadurch bleibt das Datenmodell vom ORM getrennt.

DataMapper.auto_migrate! 

würde das Schema für Sie generieren.

Active unterscheidet sich in dieser Hinsicht:

class Post < ActiveRecord::Base 
end 

In DataMapper gibt es keine Notwendigkeit für Migrationen, wie automigrations können das Schema erzeugen oder die Unterschiede zwischen dem Modell aussehen und die Datenbank und für Sie migrieren. Es gibt auch Unterstützung für die manuelle Migration, die Sie für nicht-triviale Fälle verwenden können.

Auch DataMapper ist viel mehr "Ruby" -Syntax Friendly, und Funktionen wie Lazy Loading beim Ausführen von kettenfähigen Bedingungen (wie ActiveRecord in Rails 3) gibt es von Anfang an.

Datamapper hat auch eine Funktion, dass jeder Datensatz in der Datenbank einem Ruby-Objekt zugeordnet wird, was nicht für ActiveRecord gilt. Wenn Sie also wissen, dass die Datensätze der Datenbank identisch sind, wissen Sie, dass zwei Referenzen auf das Ruby-Objekt auch auf das gleiche Objekt verweisen.

Auf der Gegenseite, während Rails 3 Ihnen austauschbare Frameworks versprechen kann, ist das Datamapper Railtie (dm-rails) nicht produktionsbereit und viele Funktionen funktionieren möglicherweise nicht.

Weitere Informationen finden Sie unter page.

1

Wie gesagt, der Unterschied liegt darin, wie Sie Domain-Objekte von der Datenzugriffsschicht trennen.

In kurzen Worten, Active "Record" ordnet ein Objekt zu einem Datensatz in der Datenbank.

Hier ist ein Objekt = ein Datensatz.

Von dem, was ich weiß, Data „Mapper“ bildet ein Objekt mit Daten, aber es muss nicht ein Rekord sein - es auch eine Datei sein könnte.

Hier braucht Ein Objekt nicht ein Datensatz

Es ist so, weil das Ziel dieses Muster: die Darstellung im Speicher zu halten und den persistenten Datenspeicher unabhängig voneinander sind und die Daten-Mapper selbst .

Indem diese 1 Objekt = 1 Datensatzeinschränkung nicht platziert wird, macht Data Mapper diese zwei Schichten unabhängig voneinander.

Alle Vorschläge/Korrekturen zu meiner Antwort sind willkommen, falls ich irgendwo falsch lag.