8 Stimmen

Was ist derzeit die beste Praxis für Persistenz?

Ich komme aus einem Java-Hintergrund.

Aber ich würde gerne eine plattformübergreifende Perspektive auf das, was als beste Praxis für die Persistenz von Objekten betrachtet wird.

So wie ich es sehe, gibt es 3 Lager:

  • ORM-Lager
  • direkte Abfrage, z. B. JDBC/DAO, iBatis
  • LINQ Lager

Werden Abfragen immer noch von Hand programmiert (unter Umgehung von ORM)? Warum, in Anbetracht der Möglichkeiten, die über JPA, Django, Rails.

6voto

Greg Beech Punkte 127525

Es gibt keine Best Practice für Persistenz (auch wenn die Zahl derer, die schreien, dass ORM die Best Practice ist, das Gegenteil vermuten lässt). Die einzige Best Practice besteht darin, die Methode zu verwenden, die für Ihr Team und Ihr Projekt am besten geeignet ist.

Wir verwenden ADO.NET und gespeicherte Prozeduren für den Datenzugriff (obwohl wir einige Hilfsmittel haben, die das Schreiben sehr schnell machen, z. B. SP-Klassen-Wrapper-Generatoren, einen IDataRecord-zu-Objekt-Übersetzer und einige Prozeduren höherer Ordnung, die allgemeine Muster und Fehlerbehandlung kapseln).

Dafür gibt es eine Reihe von Gründen, auf die ich hier nicht eingehen werde, aber es reicht zu sagen, dass es Entscheidungen sind, die für unser Team funktionieren und mit denen unser Team einverstanden ist. Und darauf kommt es letzten Endes an.

3voto

MortMan Punkte 126

Ich lese gerade über persistierende Objekte in .net. Daher kann ich keine Best Practice anbieten, aber vielleicht können meine Erkenntnisse Ihnen einen Nutzen bringen. Bis vor ein paar Monaten habe ich immer handcodierte Abfragen verwendet, eine schlechte Angewohnheit aus meiner ASP.classic-Zeit.

Linq2SQL - Sehr leicht und einfach in Betrieb zu nehmen. Ich liebe die stark typisierten Abfragemöglichkeiten und die Tatsache, dass die SQL nicht sofort ausgeführt wird. Stattdessen wird es ausgeführt, wenn die Abfrage fertig ist (alle Filter angewendet), so dass man den Datenzugriff von der Filterung der Daten trennen kann. Außerdem kann ich mit Linq2SQL Domänenobjekte verwenden, die von den Datenobjekten, die dynamisch generiert werden, getrennt sind. Ich habe Linq2SQL noch nicht in einem größeren Projekt ausprobiert, aber bisher scheint es vielversprechend zu sein. Oh, es unterstützt nur MS SQL, was eine Schande ist.

Entity Framework - Ich habe ein wenig damit herumgespielt und es hat mir nicht gefallen. Es scheint alles für mich tun zu wollen und funktioniert nicht gut mit gespeicherten Prozeduren. EF unterstützt Linq2Entities, was wiederum stark typisierte Abfragen ermöglicht. Ich glaube, es ist auf MS SQL beschränkt, aber ich könnte mich irren.

SubSonic 3.0 (Alpha) - Dies ist eine neuere Version von SubSonic, die Linq unterstützt. Das Tolle an SubSonic ist, dass es auf Vorlagedateien (T4-Vorlagen, geschrieben in C#) basiert, die Sie leicht ändern können. Wenn Sie also möchten, dass der automatisch generierte Code anders aussieht, ändern Sie ihn einfach :). Ich habe bisher nur eine Vorschau ausprobiert, werde mir aber heute die Alpha-Version ansehen. Schauen Sie mal hier SubSonic 3 Alpha . Unterstützt MS SQL, wird aber bald auch Oracle, MySql usw. unterstützen.

Bislang bin ich zu dem Schluss gekommen, Linq2SQL zu verwenden, bis SubSonic fertig ist, und dann darauf umzusteigen, da SubSonics Vorlagen viel mehr Anpassungen ermöglichen.

3voto

Ilja Preuß Punkte 2391

Es gibt mindestens eine weitere: System Prävalenz .

Was für Sie optimal ist, hängt meines Erachtens stark von Ihren Lebensumständen ab. Ich könnte mir vorstellen, dass bei sehr einfachen Systemen die Verwendung direkter Abfragen immer noch eine gute Idee sein könnte. Außerdem habe ich gesehen, dass Hibernate nicht gut mit komplexen, veralteten Datenbankschemata funktioniert, so dass die Verwendung eines ORM nicht immer eine gute Option ist. System Prevalence soll unschlagbar schnell sein, wenn Sie genug Speicher haben, um alle Ihre Objekte im RAM unterzubringen. Mit LINQ kenne ich mich nicht aus, aber ich nehme an, es hat auch seine Vorteile.

Wie so oft lautet die Antwort also: Sie sollten eine Vielzahl von Werkzeugen kennen, damit Sie das für Ihre spezielle Situation am besten geeignete einsetzen können.

2voto

Dan Vinton Punkte 25571

Die beste Vorgehensweise hängt von Ihrer Situation ab.

Wenn Sie Datenbankobjekte in Tabellenstrukturen mit einer sinnvollen Struktur benötigen (also eine Spalte pro Feld, eine Zeile pro Entität usw.), benötigen Sie eine Art Übersetzungsschicht zwischen den Objekten und der Datenbank. Diese lassen sich in zwei Gruppen einteilen:

  • Wenn es in der Datenbank keine Logik gibt (nur Speicher) und Tabellen gut auf Objekte abgebildet werden, kann eine ORM-Lösung ein schnelles und zuverlässiges Persistenzsystem bieten. Java-Systeme wie Toplink und Hibernate sind ausgereifte Technologien für diesen Zweck.

  • Wenn es es Datenbanklogik in die Persistenz involviert ist oder Ihr Datenbankschema erheblich von Ihrem Objektmodell abgewichen ist, sind Stored Procedures, die von Data Access Objects umhüllt sind (mit weiteren Mustern, wie Sie möchten), etwas aufwändiger als ORM, aber flexibler.

Wenn Sie keine strukturierte Speicherung benötigen (und Sie müssen wirklich Sie können serialisierte Objektgraphen direkt in der Datenbank speichern und so einen großen Teil der Komplexität umgehen.

2voto

Rob Williams Punkte 7849

Ich ziehe es vor, mein eigenes SQL zu schreiben, aber ich wende dabei alle meine Refactoring-Techniken und andere "gute Dinge" an.

Ich habe Datenzugriffsschichten, ORM-Codegeneratoren, Persistenzschichten, UnitOfWork-Transaktionsmanagement und jede Menge SQL geschrieben. Ich habe dies in Systemen aller Formen und Größen getan, einschließlich extrem leistungsstarker Dateneinspeisungen (vierzigtausend Dateien mit insgesamt vierzig Millionen Transaktionen pro Tag, die jeweils innerhalb von zwei Minuten in Echtzeit geladen wurden).

Das wichtigste Kriterium ist das Schicksal, also die Kontrolle darüber. Lassen Sie Ihr ORM-Tool niemals ein Hindernis für die Erledigung Ihrer Arbeit oder eine Ausrede dafür sein, dass Sie es nicht richtig machen. Letztlich wird jedes gute SQL von Hand geschrieben und von Hand abgestimmt, aber einige gute Tools können Ihnen helfen, schnell einen guten ersten Entwurf zu erstellen.

Ich behandle dieses Thema auf die gleiche Weise wie mein UI-Design. Ich schreibe alle meine Benutzeroberflächen direkt in Code, aber ich benutze vielleicht einen visuellen Designer, um einige wesentliche Elemente, die ich im Kopf habe, zu prototypisieren, und dann zerlege ich den Code, den er erzeugt, um meinen eigenen zu starten.

Verwenden Sie also ein ORM-Tool in jeder seiner Erscheinungsformen, um ein anständiges Beispiel zu erhalten - sehen Sie sich an, wie es viele der auftretenden Probleme löst (Schlüsselgenerierung, Verknüpfungen, Navigation usw.). Zerlegen Sie die Ausgabe, machen Sie sie zu Ihrer eigenen, und verwenden Sie sie dann so gut wie möglich weiter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X