Warum brauchen wir Entitätsobjekte?
Ich wirklich brauchen, um einige ehrliche, nachdenkliche Debatte über die Verdienste der derzeit anerkannten enterprise application design-Paradigma.
Ich bin nicht davon überzeugt, dass die entity-Objekte existieren sollte.
Durch entity-Objekten meine ich die typischen Dinge, die wir neigen dazu zu bauen für unsere Anwendungen, wie "Person", "Konto", "Bestellen", etc.
Meine aktuelle design-Philosophie ist diese:
- Die ganze Datenbank, muss der Zugriff erfolgt über gespeicherte Prozeduren.
- Wenn Sie Daten benötigen, eine gespeicherte Prozedur aufrufen und Durchlaufen einen SqlDataReader oder die Zeilen in einer DataTable
(Anmerkung: ich habe auch eine integrierte enterprise-Anwendungen mit Java EE, java-Leute bitte ersetzen Sie die equvalent für meine .NET Beispiele)
Ich bin nicht anti-OO. Ich Schreibe viele Klassen für verschiedene Zwecke, nur nicht von Personen. Ich gebe zu, dass ein großer Teil der Klassen die ich Schreibe, sind statische helper Klassen.
Ich bin nicht Gebäude Spielzeug. Ich spreche von großen, high-volume-transactional-Applikationen auf mehreren Rechnern. Web-Applikationen, windows services, web services, b2b-Interaktionen, you name it.
Ich verwendet habe ODER Mapper. Ich habe geschrieben ein paar. Ich habe die Java-EE-stack, CSLA, und ein paar andere Mittel. Ich habe nicht nur Sie, sondern aktiv entwickelt und gepflegt werden diese Anwendungen in Produktionsumgebungen.
Ich bin gekommen, um die Schlacht-getestet Schlussfolgerung, dass die entity-Objekte sind immer im Weg, und unser Leben wäre so viel einfacher ohne Sie.
Betrachten Sie dieses einfache Beispiel: Sie erhalten einen support-Anruf über eine bestimmte Seite in Ihrer Anwendung, die nicht korrekt funktioniert, vielleicht eines der Felder nicht beibehalten wird, wie es sein sollte. Bei meinem Modell, die Entwickler zugewiesen, um das problem zu finden, öffnet genau 3 Dateien. Eine ASPX, ASPX.CS und eine SQL-Datei mit der gespeicherten Prozedur. Das problem könnte eine fehlende parameter an die gespeicherte Prozedur aufrufen, dauert nur wenige Minuten zu lösen. Aber mit jedem entity-Modell, Sie werden immer Feuer den debugger starten Sie den code schrittweise, und Sie können am Ende mit 15-20 Dateien öffnen Sie in Visual Studio. Durch die Zeit, die Sie Schritt bis zu der Unterseite des Stapels, haben Sie vergessen, wo Sie angefangen haben. Wir können nur so viele Dinge in unseren Köpfen zu einer Zeit. Software ist unglaublich Komplex ohne Zugabe von unnötigen Schichten.
Entwicklung Komplexität und Problemlösung sind nur eine Seite von meinem Haar in der Suppe.
Reden wir nun über die Skalierbarkeit.
Entwickler wissen, dass jeder und jedes mal, wenn Sie schreiben oder modifizieren von code für die Interaktion mit der Datenbank, die Sie tun müssen, um eine throrough Analyse der genauen Auswirkungen auf die Datenbank? Und nicht nur die Entwicklung kopieren, meine ich, ein nachahmen der Produktion, damit Sie sehen können, dass die zusätzliche Spalte, die Sie jetzt benötigen für Ihr Objekt nur ungültig die aktuelle Abfrage-plan und einem Bericht, der ausgeführt wurde, in 1 Sekunde dauert nun 2 Minuten, nur weil Sie fügte hinzu, eine einzige Spalte in die select-Liste? Und es stellt sich heraus, dass der index, den Sie nun benötigen, ist so groß, dass die DBA gehen zu müssen, ändern Sie die physische Anordnung der Dateien?
Wenn Sie lassen Menschen zu weit Weg von den physischen datenspeicher mit einer Abstraktion, die Sie erstellen Chaos mit einer Anwendung, die skaliert werden.
Ich bin kein Eiferer. Ich kann überzeugt sein, wenn ich falsch bin, und vielleicht bin ich, da es so einen starken push in Richtung Linq to Sql, ADO.NET EF, Hibernate, Java EE, etc. Bitte denken Sie über Ihre Antworten, wenn mir etwas fehlt ich will wirklich wissen, was es ist, und warum ich das ändern sollte mein denken.
[Bearbeiten]
Wie es aussieht, diese Frage ist plötzlich wieder aktiv, so, jetzt haben wir die neue Kommentar-Funktion, die ich kommentiert habe direkt auf mehrere Antworten. Vielen Dank für die Antworten, ich denke, das ist eine gesunde Diskussion.
Wahrscheinlich ich hätte mehr klar, ich spreche von enterprise-Anwendungen. Ich kann nicht wirklich kommentieren, zu sagen, ein Spiel, das läuft auf einem anderen desktop oder eine mobile app.
Eine Sache, die ich haben, um sich hier an der Spitze in Reaktion auf mehrere ähnliche Antworten: Orthogonalität und die Trennung der Bereiche oft zitiert als Gründe zu gehen, entity/ORM. Gespeicherte Prozeduren, für mich sind das beste Beispiel für die Trennung von Bedenken, dass ich mir denken kann. Wenn Sie nicht zulassen, alle anderen den Zugriff auf die Datenbank, in anderer Weise als über gespeicherte Prozeduren, die Sie könnte in der Theorie Neugestaltung Ihrer gesamten Daten-Modell und nicht zu brechen jeden code, so lange, wie Sie verwaltet die ein-und Ausgänge der gespeicherten Prozeduren. Sie sind ein perfektes Beispiel des Programmierens mit Vertrag (nur so lange, wie Sie vermeiden "select *" und dokumentieren die Ergebnis-sets).
Jemanden Fragen, der war in der Industrie für eine lange Zeit und arbeitete mit langlebigen Anwendungen: wie vielen Anwendungs-und UI-Schichten sind gekommen und gegangen, während eine Datenbank gelebt hat? Wie schwer ist es zu tunen und umgestalten einer Datenbank, wenn es 4 oder 5 verschiedene Persistenz-Schichten generieren von SQL, um auf die Daten? Sie können nichts ändern! ORMs oder anderen code, der generiert die SQL - sperren Sie Ihre Datenbank in Stein.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es kommt darauf an, wie kompliziert die "Logik" der Anwendung ist, und wo haben Sie es umgesetzt. Wenn Ihre Logik ist in gespeicherten Prozeduren, und alle Ihre Anwendung ist rufen Sie diesen Verfahren und die Ergebnisse anzuzeigen, dann die Entwicklung von entity-Objekten ist in der Tat eine Verschwendung von Zeit. Aber für eine Anwendung, wo die Objekte verfügen über umfangreiche Interaktionen mit einem anderen, und die Datenbank ist nur ein Persistenz-Mechanismus, kann es sein, Wert zu haben, diese Objekte.
So, ich würde sagen, es gibt keine one-size-fits-all Antwort. Entwickler müssen sich bewusst sein, dass, manchmal, zu versuchen, auch OO kann mehr Probleme verursachen als es löst.
InformationsquelleAutor der Antwort
Theorie besagt, dass hoch kohäsiven, lose gekoppelte Implementierungen sind der Weg nach vorn.
Also ich nehme an, Sie sind zu hinterfragen, Ansatz, nämlich die Trennung betrifft.
Sollte meiner aspx.cs-Datei sein, die Interaktion mit der Datenbank durch den Aufruf einer sproc, und das Verständnis IDataReader?
In einer team-Umgebung, besonders dort, wo Sie weniger der technische Umgang der Menschen mit der aspx-Teil der Anwendung, ich brauche nicht diese Menschen in der Lage zu "berühren" dieses Zeug.
Trennung von meiner domain aus meiner Datenbank schützt mich vor strukturellen änderungen in der Datenbank, sicherlich eine gute Sache? Sicher, Datenbank Wirksamkeit ist absolut wichtig, so lassen Sie jemanden, der die meisten ausgezeichnete auf, dass stuff umgehen mit dem Zeug, an einem Ort, mit so wenig Auswirkungen auf den rest des Systems möglich.
Es sei denn, ich bin Missverständnis Ihren Ansatz, eine strukturelle änderung in der Datenbank haben könnte einen großen Einfluss Bereich mit der Oberfläche Ihrer Anwendung. Ich sehe, dass diese Trennung ermöglicht mir und meinem team, um dieses zu minimieren. Auch jedes neue Mitglied des Teams sollten verstehen, dieser Ansatz besser.
Auch Ihr Ansatz scheint für die business-Logik der Anwendung zu wohnen, die in Ihrer Datenbank? Das fühlt sich für mich falsch, SQL-wirklich gut ist die Abfrage von Daten, und nicht, imho, mit dem Ausdruck business-Logik.
Interessanter Gedanke aber, obwohl es sich anfühlt, einen Schritt Weg von SQL, die in der aspx -, die aus meiner schlechten alten unstrukturierten asp Tagen, erfüllt mich mit Abscheu.
InformationsquelleAutor der Antwort
Einer Grund - Trennung des Domänen-Modells aus der Datenbank-Modell.
Was ich Tue, ist die Verwendung von Test Driven Development, also Schreibe ich meine Benutzeroberfläche und Modell-Ebenen und die Daten-Schicht verspottet wird, also die Benutzeroberfläche und das Modell bauen um domain-spezifische Objekte, dann später habe ich anzeigen dieser Objekte zu was auch immer-Technologie bin ich mit dem Daten-Layer. Seine eine schlechte Idee, lassen Sie die Datenbank-Struktur bestimmen das design Ihrer Anwendung. Wo möglich schreiben Sie die erste app und lassen Sie, dass Sie Einfluss auf die Struktur der Datenbank, nicht die andere Weise herum.
InformationsquelleAutor der Antwort
Es für mich darauf an, ich will nicht, dass meine Anwendung zu befassen, wie mit den Daten gespeichert ist. Werd ich wohl kriegen, das zu sagen...aber die Anwendung ist nicht Ihrer Daten, ist ein Artefakt der Anwendung. Ich möchte meine Anwendung zu denken in Bezug auf Kunden, Bestellungen und Artikel, die nicht eine Technologie wie DataSets, DataTables und von DataRows...denn wer weiß, wie lange diese sein wird, herum.
Ich bin damit einverstanden, dass es immer eine bestimmte Menge der Verbindung, aber ich bevorzuge, dass die Kopplung zu erreichen, nach oben statt nach unten. Ich kann zwicken in den Gliedmaßen und Blätter eines Baumes leichter als das, ich kann es ändern Kofferraum ist.
Ich dazu neigen zu behalten sprocs für die Berichterstattung wie die Abfragen neigen dazu, ein wenig versauter als die Anwendungen, die Allgemeinen Daten zugreifen.
Ich Neige auch zu denken, mit der richtigen unit-Tests früh auf, das Szenario ist wie dass eine Spalte nicht beibehalten wird, ist wahrscheinlich nicht ein problem sein.
InformationsquelleAutor der Antwort
Eric,
Sie sind tot auf. Für eine wirklich skalierbare /leicht zu pflegen /robuste Anwendung, die einzige wirkliche Antwort ist, um ohne all den Müll und halten Sie sich an die Grundlagen.
Habe ich befolgt eine ähnliche Flugbahn mit meiner Karriere und kommen zu den gleichen Schlussfolgerungen. Natürlich werden wir uns als Ketzer und komisch angeschaut. Aber mein Zeug funktioniert und funktioniert gut.
Jede Zeile code sollte mit Argwohn betrachtet.
InformationsquelleAutor der Antwort
Möchte ich Ihnen mit einem Beispiel, wie Sie Sie vorgeschlagen.
Auf meine Firma hatte ich eine einfache CRUD-Abschnitt für Produkte, Baue ich alle meine Einheiten und einem separaten DAL. Später ein anderer Entwickler hatte zum ändern einer verknüpften Tabelle und er hat sogar mehrere Felder umbenannt. Die einzige Datei, die ich hatte, zu ändern, zu aktualisieren, meine form war das DAL für die Tabelle.
Was (meiner Meinung nach) Unternehmen bringt ein Projekt ist:
Ortogonality: Änderungen in einer Schicht, die möglicherweise nicht auf anderen Ebenen (off natürlich, wenn Sie machen eine große Veränderung auf der Datenbank würde es Kräuselung durch alle Schichten, aber die meisten kleinen änderungen nicht).
Testbarkeit: Sie können testen Sie Ihre Logik mit sich berühren Sie Ihre Datenbank. Dies erhöht die Leistung auf die tests (so dass Sie laufen häufiger).
Trennung von Belangen: In einer großen Produkt-zuordnen können Sie die Datenbank zu einem DBA und er kann optimieren die Hölle aus ihm heraus. Ordnen Sie das Modell, um ein business-Experte, der das notwendige wissen zum design. Ordnen Sie die einzelnen Formen, die für Entwickler mehr Erfahrung auf webforms etc..
Schließlich möchte ich hinzufügen, dass die meisten ORM-Mapper Unterstützung für gespeicherte Verfahren, da es ist, was Sie verwenden.
Cheers.
InformationsquelleAutor der Antwort
Denke ich, können Sie "abbeißen mehr als man kauen kann" zu diesem Thema. Ted Neward war nicht leichtfertig, wenn er nannte es die "Vietnam of Computer Science".
Eines kann ich absolut garantieren, ist, dass es niemand ändern der Sicht auf die Materie, wie hat sich erwiesen, so oft auf unzähligen anderen blogs, Foren, podcasts etc.
Es ist sicherlich ok, um offene disucssion und die Debatte über ein umstrittenes Thema, es ist nur dieser eine getan worden, so viele Male, dass beide "Seiten" geeinigt haben, uneinig zu sein und habe mit dem schreiben von software.
Wenn Sie wollen, um einige weitere Lesen auf beiden Seiten, siehe Artikel auf Ted ' s blog, Ayende Rahein, Jimmy Nilson, Scott Bellware, Alt.Net Stephen Forte, Eric Evans etc.
InformationsquelleAutor der Antwort
@Dan, sorry, das ist nicht die Art von Sache, die ich bin auf der Suche nach. Ich kenne die Theorie. Ihre Aussage "ist eine sehr schlechte Idee" ist nicht gesichert, der von einem realen Beispiel. Wir versuchen, eine software zu entwickeln, die in weniger Zeit, mit weniger Menschen, mit weniger Fehlern, und wir wollen die Möglichkeit, einfach änderungen vornehmen. Ihre multi-layer-Modell, meiner Erfahrung nach, ist ein negatives, in allen der oben genannten Kategorien. Vor allem mit Bezug auf die Daten-Modell das Letzte, was Sie tun. Das physische Datenmodell muss eine wichtige überlegung, die von Tag 1.
InformationsquelleAutor der Antwort
Ich fand deine Frage sehr interessant.
In der Regel brauche ich, Entitäten, Objekte zum Kapseln der Geschäftslogik einer Anwendung. Es wäre wirklich kompliziert und unzureichend sind, um die drücken Sie diese Logik in der Daten-Schicht.
Was würden Sie tun, um zu vermeiden, dass diese Entitäten Objekte? Welche Lösung haben Sie im Sinn?
InformationsquelleAutor der Antwort
Entity-Objekte erleichtern kann Cachen auf dem application layer. Viel Glück caching einen datareader.
InformationsquelleAutor der Antwort
Sollten wir auch sprechen über die Vorstellung, was die Personen wirklich sind.
Als ich gelesen habe, durch diese Diskussion, habe ich den Eindruck, dass die meisten Leute hier sind auf der Suche Entitäten im Sinne einer Anemic Domain Model.
Eine Menge Leute sind angesichts der Anemic Domain Model als ein antipattern!
Es ist Wert in rich-domain-Modellen. Das ist das, was Domain-Driven Design.
Ich persönlich glaube, dass OO ist ein Weg, um zu erobern Komplexität. Dies bedeutet nicht nur die technische Komplexität (wie Daten-Zugriff, ui-Bindung, Sicherheit ...) aber auch die Komplexität in der business-domain -!
Wenn wir anwenden können OO-Techniken zur Analyse, Modellierung, Konzeption und implementieren unsere business-Probleme, dies ist ein großer Vorteil für die Wartbarkeit und Erweiterbarkeit des nicht-triviale Anwendungen!
Gibt es Unterschiede zwischen den Entitäten und Ihre Tabellen. Entitäten repräsentieren sollte Ihr Modell, Tabellen stellen nur der Daten-Aspekt Ihres Modells!
Es ist wahr, dass Daten Leben länger als apps, aber Bedenken Sie dieses Zitat von David Laribee: die Modelle werden immer ... Daten, ist ein glücklicher Nebeneffekt.
Einige weitere links zu diesem Thema:
Warum Setter und Getter sind böse
Rückkehr von der reinen OO
POJO vs. NOJO
Super Modelle Teil 2
TDD, Verhöhnt und Design
InformationsquelleAutor der Antwort
Wirklich eine interessante Frage. Ehrlich gesagt, ich kann es nicht beweisen, warum die Personen sind gut. Aber ich kann teilen Sie meine Meinung, warum ich Sie mag. Code wie
ist nicht betroffen, wenn Auftrag kam von der DB, von der web-Anfrage, die von unit-test, etc. Es macht diese Methode mehr explizit erklären, was genau es erfordert, statt DataRow-und dokumentieren, welche Spalten es erwartet haben und welche Art Sie sein sollten. Dasselbe gilt, wenn Sie das umsetzen irgendwie als gespeicherte Prozedur - die Sie noch brauchen, um push-Datensatz-id, um es, während es nicht notwendig ist, sollte vorhanden sein in der DB.
Umsetzung dieser Methode basiert auf, Um Abstraktion, nicht auf der Grundlage, wie genau es wird dargestellt, in DB. Die meisten solcher Operationen, die ich umgesetzt habe wirklich nicht davon abhängen, wie diese Daten gespeichert werden. Ich verstehe, dass einige Operationen erfordern, dass die Kopplung mit der DB-Struktur für die perfomance und Skalierbarkeit Zwecke, nur in meiner Erfahrung gibt es nicht allzu viel von Ihnen. In meiner Erfahrung sehr oft ist es genug, um zu wissen, die Person hat .getFirstName() Rückgabe String, und .getAddress() Rückkehr-Adresse, und Adresse hat .getZipCode(), etc. - und kümmern sich nicht, die Tabellen sind involed um die Daten zu speichern.
Wenn Sie es zu tun haben mit solche Probleme wie du beschrieben, wie wenn zusätzliche Spalte bricht der Bericht perfomance, dann für Ihre Aufgaben DB ist eine kritische Komponente, und Sie in der Tat sollte so nah wie möglich. Während die Entitäten können einige praktische Abstraktionen, die Sie verstecken können einige wichtige details.
Skalierbarkeit ist der interessante Punkt hier - die meisten der websites, die erfordern enorme Skalierbarkeit (wie facebook, livejournal, flickr) dazu neigen, den Einsatz DB-asketischen Ansatz, als die DB verwendet wird, so selten wie möglich und Skalierbarkeit Probleme werden gelöst, indem caching, insbesondere durch RAM-Auslastung. http://highscalability.com/ einige interessante Artikel auf Sie.
InformationsquelleAutor der Antwort
Gibt es andere gute Gründe für entity-Objekte neben Abstraktion und lose Kopplung. Eines der Dinge, die ich am meisten mag, ist die starke Typisierung, man kann nicht mit DataReader-Objekt oder ein DataTable. Ein weiterer Grund ist, dass, wenn gut gemacht, richtige entity-Klassen können den code mehr maintanable durch die Verwendung von erste-Klasse-Konstrukte für domain-spezifische Begriffe dass alle, die sich an dem code ist wahrscheinlich zu verstehen, sondern als eine Reihe von strings mit den Feldnamen, die in Ihnen verwendet werden, für die Indizierung einer DataRow. Gespeicherte Prozeduren sind wirklich orthogonal zu der Verwendung eines ORM, da eine Menge von mapping-frameworks geben Ihnen die Möglichkeit, anzeigen zu sprocs.
Ich würde das nicht als sprocs + datareaders ein Ersatz für einen guten ORM. Mit gespeicherten Prozeduren, sind Sie noch immer gebunden, und eng gekoppelt an die Prozedur geben Sie die Signatur, die verwendet eine andere Art von system als der aufrufende code. Gespeicherte Prozeduren können änderungen unterworfen sein, um acommodate zusätzliche Optionen und schema-änderungen. Eine alternative zu den gespeicherten Prozeduren in dem Fall, wo das schema ist abhängig von änderung ist die Verwendung von Ansichten-Sie können die Karte-Objekte zu sichten und dann re-map-Ansichten zu den zugrunde liegenden Tabellen, wenn Sie Sie ändern.
Verstehen kann ich Ihre Abneigung gegen ORMs, wenn Ihr Erfahrung besteht hauptsächlich aus Java EE-und CSLA. Möchten Sie vielleicht einen Blick auf LINQ to SQL, die einen sehr leichten Rahmen und ist in Erster Linie eine eins-zu-eins-Zuordnung mit der Datenbank-Tabellen, aber in der Regel braucht nur geringfügige Erweiterung für ausgewachsene business-Objekte. LINQ to SQL kann auch map-input-und output-Objekten für gespeicherte Prozeduren' Parameter und Ergebnisse.
Den ADO.NET Entity framework hat den zusätzlichen Vorteil, dass Ihre Datenbank-Tabellen kann angezeigt werden als entity-Klassen Erben von einander, oder Spalten aus mehreren Tabellen aggregiert in einer einzelnen Entität. Wenn Sie brauchen, um das schema ändern, ändern Sie das mapping vom konzeptionellen Modell, um den Speicher-schema, ohne dass die tatsächliche Anwendung code. Und wieder, gespeicherte Prozeduren können hier verwendet werden.
Ich denke, dass mehr IT-Projekte in Unternehmen scheitern, weil der unmaintainability der code oder die schlechte Produktivität der Entwickler (die passieren können aus, z.B., Kontext-switching zwischen sproc-Erstellung und app-schreiben) als Probleme der Skalierbarkeit einer Anwendung.
InformationsquelleAutor der Antwort
Ich würde auch gerne hinzufügen,Dan ' s Antwortdass die Trennung der beiden Modelle ermöglichen könnte, in der Ihre Anwendung ausgeführt werden, auf unterschiedliche Datenbank-Server oder auch Datenbank-Modelle.
InformationsquelleAutor der Antwort
Was, wenn Sie brauchen, um skalieren Sie Ihre app, indem Sie load balancing, mehr als ein web-server? Sie könnten installieren Sie das vollständige app auf allen web-Servern, aber eine bessere Lösung ist, den web-Servern sprechen Sie mit einem application server.
Aber wenn es nicht alle entity-Objekte, die Sie nicht haben sehr viel zu erzählen.
Ich sage nicht, dass Sie sollten nicht schreiben Monolithen, wenn Ihr eine einfache, interne, kurze Lebensdauer Anwendung. Aber sobald es mäßig Komplex, oder es sollte eine erhebliche Menge an Zeit, die Sie wirklich brauchen, zu denken, über ein gutes design.
Das spart Zeit, wenn es um die Erhaltung es.
Durch die Aufteilung der Anwendungslogik von der Präsentation, Logik und Daten zugreifen zu können, und durch die übergabe DTOs zwischen Ihnen, Sie entkoppelt. So dass Sie unabhängig voneinander geändert werden können.
InformationsquelleAutor der Antwort
Finden Sie vielleicht diese post auf comp.Objekt interessant.
Bin ich nicht fordern, zu Zustimmen oder nicht, aber es ist interessant und (ich denke) relevanten zu diesem Thema.
InformationsquelleAutor der Antwort
Frage: Wie gehen Sie mit getrennten Anwendungen, wenn alle Ihre business-Logik ist gefangen in der Datenbank?
In der Art der Enterprise-Anwendung, die ich bin daran interessiert, mit der wir umgehen müssen mehrere Standorte, einige von Ihnen müssen in der Lage sein, um die Funktion in einem getrennten Zustand.
Wenn Ihre Geschäftslogik gekapselt ist in einer Domain-Ebene, die die einfache Integration in verschiedene Anwendungs-Typen -sagen, wie ein
dll
- dann kann ich die Erstellung von Anwendungen, die sich der Geschäfts-Regeln und sind in der Lage, wenn nötig, für Sie gelten lokal.Im halten der Domain-Schicht, die in gespeicherten Prozeduren für die Datenbank, die Sie haben zu stick mit einer einzigen Art von Anwendung, muss eine ständige Sichtverbindung zu der Datenbank.
Ist es ok, für eine bestimmte Klasse von Umgebungen, aber es ist sicherlich nicht das gesamte Spektrum abdecken von Enterprise-Anwendungen.
InformationsquelleAutor der Antwort
@jdecuyper, einer Maxime ich wiederhole mich oft: "wenn Ihre Geschäftslogik ist nicht in der Datenbank, es ist nur eine Empfehlung". Ich denke, Paul Nielson sagte, dass in einem seiner Bücher. Anwendung von Ebenen und UI kommen und gehen, aber die Daten in der Regel Leben für eine sehr lange Zeit.
Wie kann ich vermeiden, dass die entity-Objekte? Gespeicherte Prozeduren meist. Ich habe auch frei zugeben, dass business-Logik neigt dazu, zu erreichen durch alle Schichten in einer Anwendung, ob Sie wollen es oder nicht. Eine gewisse Kopplung ist inhärent und unvermeidlich.
InformationsquelleAutor der Antwort
Denke ich darüber nach, die gleiche Sache in letzter Zeit viel; ich war ein heavy user von CSLA für eine Weile, und ich Liebe die Reinheit der Aussage, dass "alle Ihre business-Logik (oder zumindest so viel wie vernünftigerweise möglich ist) ist gekapselt in business-Entitäten".
Habe ich gesehen, die business-entity-Modell eine Menge von Wert in Fällen, in denen das design der Datenbank ist anders als die Art, wie Sie mit den Daten arbeiten, was der Fall ist, in einer Menge von business-software.
Beispielsweise die Idee von einem "Kunden" aus einer Haupt-Datensatz in einer Tabelle "Kunde", kombiniert mit all der Aufträge, die der Kunde gestellt hat, sowie allen Mitarbeitern des Kunden und Ihre Kontakt-Informationen, und einige der Eigenschaften von einem Kunden und seiner Kinder bestimmt werden kann, von lookup-Tabellen. Es ist wirklich schön, von einer Entwicklungs Standpunkt, um in der Lage zu arbeiten mit dem Kunden als eine Einheit, da aus einer business-Perspektive, das Konzept des Kunden enthält alle diese Dinge, und die Beziehungen, die kann oder kann nicht erzwungen werden, in der Datenbank.
Während ich Schätze das Zitat "wenn Ihre business-Regel ist nicht in der Datenbank, es ist nur ein Vorschlag", ich glaube auch, dass Sie sollten nicht design der Datenbank zum erzwingen von Geschäftsregeln, sollten Sie es planen, effizient, schnell und normalisiert.
Sagte, dass, wie andere schon oben angemerkt, es gibt kein "perfektes design", das tool fit im job. Aber die Verwendung von business-Entitäten kann wirklich helfen, mit Wartung und Produktivität, da Sie wissen, wo zu gehen, um zu ändern, business-Logik und Objekte Modell real-Welt-Konzepte in einer intuitiven Weise.
InformationsquelleAutor der Antwort
Eric,
Niemand hindert Sie, von der Auswahl der framework-Ansatz, dass Sie sich wünschen würden. Wenn du gehst, zu gehen die "data driven/gespeicherte Prozedur-powered" Weg, dann mit allen Mitteln, go for it! Vor allem, wenn es wirklich, wirklich hilft Ihnen bei der Bereitstellung Ihrer Anwendungen auf-spec-und-Zeit.
Dem VORBEHALT, dass (auch eine Kehrseite zu deiner Frage, die ist), die ALLE Ihre business-Regeln sollten auf gespeicherte Prozeduren, und Ihre Anwendung ist nichts anderes als ein thin client.
Dass gesagt wird, die gleichen Regeln gelten, wenn Sie Ihre Anwendung in der OOP : konsequent sein. Folgen OOP ' s lehren, und dass umfasst das erstellen von entity-Objekten zu repräsentieren, Ihre domain-Modelle.
Die einzige wirkliche Regel ist hier das Wort Konsistenz. Niemand hindert Sie daran gehen, DB-centric. Niemand hindert Sie tun der alten Schule strukturiert (aka, funktionale/prozedurale) Programme. Hölle, niemand hindert irgendjemanden zu tun, COBOL-Stil-code. ABER eine Anwendung hat sehr, sehr konsequent einmal auf diesem Weg, wenn er wünscht, zu erreichen, jedem Grad des Erfolgs.
InformationsquelleAutor der Antwort
Ich bin wirklich nicht sicher, was du als "Enterprise-Anwendungen". Aber ich bin immer den Eindruck, Sie definieren es als eine Interne Anwendung, in dem die RDBMS wäre in Stein gemeißelt und das system würde nicht auf Interoperabilität mit anderen Systemen, ob interne oder externe.
Aber was, wenn Sie hatte eine Datenbank mit 100 Tabellen, die gleich 4 Gespeicherte Prozeduren für jede Tabelle nur für grundlegende CRUD-Operationen, die 400 gespeicherte Prozeduren, die müssen gepflegt werden und sind nicht stark typisiert, so sind anfällig für Tippfehler, noch kann die Einheit Getestet. Was passiert, wenn Sie sich einen neuen CTO, der ist ein Open-Source-Evangelist und will in der RDBMS von SQL Server zu MySql?
Viele software heute die Frage, ob Enterprise Anwendungen oder Produkte sind mit Hilfe von SOA und haben einige Anforderungen für die Aufdeckung von Web-Services, zumindest die software, die ich bin und die mit tun.
Mit Ihrem Ansatz, den Sie würde sich am Ende herausstellen eines Serialisierten DataTable oder von DataRows. Nun, das mag sein, gilt als akzeptabel, wenn der AUFTRAGGEBER garantiert werden .NET und auf einem internen Netzwerk. Aber wenn der Client nicht bekannt ist, dann sollten Sie bestrebt sein, zu Entwerfen ein API, das ist intuitiv und in den meisten Fällen würden Sie nicht wollen, um das aussetzen der Vollständigen Datenbank-schema.
Ich würde sicherlich nicht wollen, zu erklären, um ein Java-Entwickler, was eine DataTable ist und wie es zu benutzen. Es gibt auch die Betrachtung der Bandbreite und der payload-Größe und serialisiert DataTables-DataSets sind sehr schwer.
Es gibt keine silberne Kugel mit software-design-und es hängt wirklich davon ab, wo die Prioritäten liegen, ist es für mich in der Einheit von Testbarem code und lose gekoppelten Komponenten, die leicht konsumiert werden jeden client.
just my 2 cents
InformationsquelleAutor der Antwort
Würde ich gerne einen anderen Blickwinkel auf das problem der Distanz zwischen OO und RDB: Geschichte.
Jede software hat ein Modell der Wirklichkeit, ist in gewissem Grade eine Abstraktion der Wirklichkeit. Kein Computerprogramm kann die Erfassung der Komplexität der Realität, und die Programme werden geschrieben, nur um das lösen einer Reihe von Problemen aus der Realität. Daher kann der software-Modell ist eine Reduktion der Realität. Manchmal ist die software-Modell-Kräfte, die Wirklichkeit zu reduzieren, selbst. Wie, wenn Sie wollen, dass die Mietwagen-Firma zu reservieren, Auto für Sie, solange es ist blau und hat-Legierungen, aber der Betreiber kann sich nicht erfüllen, weil Ihr Antrag passt nicht in den computer.
RDB stammt aus einer sehr alten tradition setzen Sie Informationen in Tabellen, "Buchhaltung". Die Buchhaltung erfolgte auf Papier, dann auf Lochkarten, dann im Computer. Aber Buchhaltung ist bereits eine Reduktion der Wirklichkeit. Die Buchhaltung hat die Menschen dazu gezwungen zu Folgen, sein system so lange geworden, dass es Realität akzeptiert. Deshalb ist es relativ einfach, um computer-software für das Rechnungswesen, die Buchhaltung hat Ihren information model, lange bevor die computer kamen.
Angesichts der Bedeutung, die gutes Rechnungswesen, und die Annahme, Sie Holen Sie aus jeder business-Manager, diese Systeme haben sich sehr erweitert. Die Datenbank Grundlagen sind nun sehr solide und niemand zögert, über die wichtige Daten in etwas so vertrauenswürdig.
Denke ich, dass OO muss kommen, wenn die Menschen gefunden haben, die anderen Aspekte der Wirklichkeit sind schwerer zu modellieren als die Buchhaltung (was schon ein Modell). OO hat eine sehr erfolgreiche Idee, aber Persistenz von OO-Daten relativ schwach ausgeprägt. RDB/Rechnungswesen gehabt hat, einfach gewinnt, aber OO ist ein viel größeres Feld (im Grunde alles, was nicht-und Rechnungswesen).
So viele von uns haben wollte OO aber wir wollen immer noch die sichere Speicherung unserer Daten. Was kann sicherer sein, als die Speicherung von Daten der gleichen Weise wie die geschätzten Rechnungswesen? Es ist eine verlockende Aussichten, aber wir laufen alle in die gleichen Fallstricke. Nur sehr wenige haben sich die Mühe gemacht, zu denken OO Persistenz im Vergleich zu den massiven Anstrengungen der RDB-Industrie, die hat den Vorteil gehabt, Rechnungswesen tradition und position.
Prevayler und db4o sind einige Vorschläge, ich bin sicher, es gibt andere, die ich noch nicht gehört, aber keiner schien, dass die Hälfte der Presse als, sagen wir, im Ruhezustand.
Speichern Ihre Objekte in guten alten Dateien gar nicht scheinen, um ernst genommen zu werden für multiuser-Anwendungen und insbesondere web-Anwendungen.
In meinem täglichen Kampf um das schließen der Kluft zwischen OO und RDB ich benutze OO so viel wie möglich, aber versuchen Sie, um die Vererbung auf ein minimum. Ich glaube nicht, verwenden oft SPs. Ich verwende die erweiterte Abfrage-Zeug nur in den Aspekten, die Aussehen wie die Buchhaltung.
Werde ich sein glücklich überrascht, wenn die Schlucht geschlossen ist, für gut. Ich glaube, die Lösung wird kommen, wenn Oracle startet so etwas wie "Oracle-Objekt-Instanz-Basis". Um wirklich zu fangen, wird es zu haben ist eine beruhigende Namen.
InformationsquelleAutor der Antwort
Nicht viel Zeit im moment, aber nur aus der Spitze von meinem Kopf...
Dem entity-Modell können Sie eine konsistente Schnittstelle zur Datenbank (und anderer Systeme) sogar über das hinaus, was eine gespeicherte Prozedur-Schnittstelle tun können. Mithilfe von enterprise-wide business Modelle können Sie sicherstellen, dass alle Anwendungen auf die Daten konsistent, ist eine SEHR wichtige Sache. Andernfalls Sie am Ende mit schlechten Daten, die einfach nur böse.
Wenn Sie nur eine Applikation haben, dann Sie don ' T haben wirklich eine "enterprise" - system, unabhängig davon, wie groß die Anwendung oder Ihre Daten sind. In diesem Fall kann man einen Ansatz verwenden, der ähnlich zu dem, was Sie sprechen über. Nur bewusst sein, dass die Arbeit, die benötigt wird, wenn Sie sich entscheiden, zu wachsen, Ihre Systeme in die Zukunft.
Hier sind ein paar Dinge, die Sie beachten sollten (IMO) aber:
(Ausnahmen Folgen). Sorry, Ich
wissen, dass eine Menge Leute denken, dass
es ist eine große Zeitersparnis, aber ich habe
nie ein system gefunden, das das könnte
generieren effizienteren code als
was ich schreiben könnte, und oft die
code ist einfach nur schrecklich. Sie
auch oft am Ende die Erzeugung einer Tonne
der SQL-code, der nie genutzt wird.
Die Ausnahme ist hier sehr einfach
Muster, wie vielleicht von lookup-Tabellen.
Eine Menge Leute hinreißen lassen, auf
es ist jedoch.
InformationsquelleAutor der Antwort
Manchmal, Ihre Anwendung und Daten-Schicht, sind nicht eng gekoppelt. Zum Beispiel können Sie ein Telefon-Rechnungs-Anwendung. Sie später erstellen Sie eine separate Anwendung, die überwacht Handy-Nutzung a) besser werben zu Sie b) optimieren Sie Ihre Telefon-plan.
Diese Anwendungen haben unterschiedliche Anliegen und die erforderlichen Daten (auch die Daten aus der gleichen Datenbank), Sie würden verschiedene designs. Ihre code-Basis kann am Ende eine absolute Sauerei (in jeder Anwendung) und ein Alptraum zu pflegen, wenn Sie lassen Sie die Datenbank-Laufwerk den code.
InformationsquelleAutor der Antwort
Anwendungen, die domain-Logik getrennt von der Daten-Speicher-Logik sind anpassungsfähig an jede Art von Datenquelle (Datenbank oder anderweitig) oder UI (web-oder windows - (oder linux, etc.)) - Anwendung.
Ihr ziemlich viel stecken in Ihrer Datenbank, die ist nicht schlecht, wenn Ihr mit einer Firma, die ist zufrieden mit der aktuellen Datenbank-system Ihre Verwendung. Jedoch, da die Datenbanken entwickeln sich die überstunden könnte es einen neuen Datenbank-system, dass ist wirklich nett und neu, dass Ihre Firma nutzen möchte. Was ist, wenn Sie wechseln wollen, um eine web-Service-Methode für den Zugriff auf Daten (wie Service-Orientierte Architektur irgendwann funktioniert). Müssen Sie möglicherweise einen port den gespeicherten Prozeduren alle über dem Platz.
Auch die domain-Logik abstrahiert Sie Weg, die UI, die wichtiger sein können in großen, komplexen Systemen mit sich ständig weiterentwickelnden UIs (vor allem, wenn Sie sind ständig auf der Suche nach mehr Kunden).
Auch, während ich damit einverstanden, dass es keine endgültige Antwort auf die Frage von gespeicherten Prozeduren versus domain-Logik. Ich bin in der Domäne der Logik camp (und ich denke, Sie gewinnen im Laufe der Zeit), weil ich glaube, dass das erarbeiten von gespeicherten Prozeduren, sind schwieriger zu verwalten als die aufwendige domain-Logik. Aber das ist eine ganze andere Debatte
InformationsquelleAutor der Antwort
Ich denke, dass Sie nur verwendet, um das schreiben eine bestimmte Art von Anwendung, und die Lösung einer bestimmten Art von problem. Sie scheinen angreifen, wenn diese aus einem "Datenbank-first" - Perspektive. Es gibt viele Entwickler gibt, in denen Daten persistent gespeichert, um eine DB, aber die Leistung ist nicht top-Priorität. In vielen Fällen setzen eine Abstraktion der Persistenzschicht vereinfacht den code erheblich und die performance Kosten ist ein nicht-Problem.
Was auch immer Sie tun, es ist nicht OOP. Es ist nicht falsch, es ist nur nicht OOP, und es macht keinen Sinn, sich zu bewerben Ihre Lösungen für jedes andere problem gibt.
InformationsquelleAutor der Antwort
Interessante Frage. Ein paar Gedanken:
InformationsquelleAutor der Antwort
Gute Frage!
Ein Ansatz, den ich ziemlich mag, ist erstellen einen iterator/generator-Objekt erzeugt, Instanzen von Objekten, die relevant sind, auf einen bestimmten Kontext. Normalerweise wird dieses Objekt umschließt einige zugrunde liegende Datenbank-access-Zeug, aber ich brauche nicht zu wissen, dass wenn Sie es verwenden.
Beispielsweise
Habe ich gefunden, dass dies funktioniert gut, wenn ich habe einen riesigen Datensatz zu arbeiten, und, wenn richtig gemacht, gibt es mir kleine, transiente Objekte, die relativ einfach zu testen.
Es ist im Grunde eine dünne Schicht über den Datenbank-Zugriff Zeug, aber es gibt mir immer noch die Flexibilität der Abstraktion ist es, wenn ich muss.
InformationsquelleAutor der Antwort
Objekte in meinem apps tendenziell eins-zu-eins auf die Datenbank, aber ich finde die Verwendung von Linq To Sql eher als sprocs macht es viel einfacher wird das schreiben der komplizierten Abfragen, besonders, wenn man in der Lage, um Sie aufzubauen mit der verzögerten Ausführung. z.B. von r in Bildern.Benutzer.Bewertungen wo usw. Das spart mir versuchen zu arbeiten, mehrere join-Anweisungen in sql und mit Skip & Nehmen Sie für paging vereinfacht auch den code anstatt zum einbetten der row_number & 'über' code.
InformationsquelleAutor der Antwort
Warum stoppen Sie am entity-Objekte? Wenn Sie nicht sehen, den Wert mit der entity-Objekte, die in einer enterprise-level-app, dann tun Sie nur Ihre Daten zugreifen, die in einer rein funktionale/prozedurale Sprache, und Draht es bis zu einem UI. Warum nicht einfach nur ausgeschnitten alle OO "fluff"?
InformationsquelleAutor der Antwort