Wo sollte eine JDBC-kompatible Anwendung ihre SQL-Anweisungen speichern und warum?
Bisher konnte ich folgende Optionen identifizieren:
- In Geschäftsobjekten fest codiert
- Eingebettet in SQLJ Klauseln
- In getrennten Klassen einkapseln, z Datenzugriffsobjekte
- Metadatengesteuert (entkoppeln Sie das Objektschema vom Datenschema - beschreiben Sie die Zuordnungen zwischen ihnen in Metadaten)
- Externe Dateien (z. B. Eigenschaften- oder Ressourcendateien)
- Gespeicherte Prozeduren
Was sind die Vor- und Nachteile für jeden einzelnen?
Sollte SQL-Code als "Code" oder "Metadaten" betrachtet werden?
Sollten gespeicherte Prozeduren nur zur Leistungsoptimierung verwendet werden oder sind sie eine legitime Abstraktion der Datenbankstruktur?
Ist Leistung ein Schlüsselfaktor für die Entscheidung? Was ist mit der Lieferantenbindung ?
Was ist besser - lose oder enge Kupplung und warum?
EDITED: Vielen Dank an alle für die Antworten - hier ist eine Zusammenfassung:
Metadatengesteuert, dh Object Relational Mappings (ORM)
Vorteile:
- Sehr abstrakt - Der DB-Server kann gewechselt werden, ohne dass das Modell geändert werden muss
- Weit verbreitet - praktisch ein Standard
- Reduziert die Menge an benötigtem SQL
- Kann SQL in Ressourcendateien speichern
- Leistung ist (normalerweise) akzeptabel
- Metadatengetriebener Ansatz
- Herstellerunabhängigkeit (Datenbank)
Nachteile:
- Versteckt SQL und echte Entwicklerabsichten
- SQL kann vom DBA nur schwer überprüft / geändert werden
- In ungeraden Fällen wird möglicherweise noch SQL benötigt
- Kann die Verwendung einer proprietären Abfragesprache erzwingen, z. B. HQL
- Geeignet nicht zur Optimierung (Abstraktion)
- Kann referenzielle Integrität fehlen
- Ersatz für mangelnde SQL-Kenntnisse oder mangelnde Sorgfalt beim Codieren in der Datenbank
- Passen Sie niemals die native Datenbankleistung an (auch wenn sie nahe kommt).
- Der Modellcode ist sehr eng mit dem Datenbankmodell gekoppelt
Hardcodiert / eingekapselt in DAO-Schicht
Vorteile:
- SQL wird in den Objekten gespeichert, die auf Daten zugreifen (Kapselung)
- SQL ist einfach zu schreiben (Entwicklungsgeschwindigkeit)
- SQL ist leicht zu finden, wenn Änderungen erforderlich sind
- Einfache Lösung (keine chaotische Architektur)
Nachteile:
- SQL kann vom DBA nicht überprüft / geändert werden
- SQL wird wahrscheinlich DB-spezifisch
- SQL kann schwer zu warten sein
Gespeicherte Prozeduren
Vorteile:
- SQL in der Datenbank gespeichert (in der Nähe von Daten)
- SQL wird vom DBMS analysiert, kompiliert und optimiert
- SQL kann von DBA leicht überprüft / geändert werden
- Reduziert den Netzwerkverkehr
- Erhöhte Sicherheit
Nachteile:
- SQL ist an die Datenbank gebunden (Vendor Lock-In).
- SQL-Code ist schwieriger zu pflegen
Externe Dateien (z. B. Eigenschaften- oder Ressourcendateien)
Vorteile
- SQL kann geändert werden, ohne dass die Anwendung neu erstellt werden muss
- Entkoppelt die SQL-Logik von der Geschäftslogik der Anwendung
- Zentrales Repository aller SQL-Anweisungen - einfacher zu warten
- Leichter zu verstehen
Nachteile:
- SQL-Code kann nicht mehr wartbar sein
- Es ist schwieriger, den SQL-Code auf (Syntax-) Fehler zu überprüfen
Eingebettet in SQLJ-Klauseln
Vorteile:
- Bessere Syntaxprüfung
Nachteile:
- Bindet zu eng an Java
- Geringere Leistung als JDBC
- Fehlende dynamische Abfragen
- Nicht so beliebt