Frage

In einem PHP-Projekt arbeite ich an müssen wir einige DAL-Erweiterungen erstellen mehrere Datenbank-Plattformen zu unterstützen. Das Haupt pitfall wir mit diesen haben, ist, dass verschiedene Plattformen haben unterschiedliche Syntaxen -. Bemerkenswerten MySQL und MSSQL sind ganz anders

Was ist die beste Lösung für dieses Problem wäre?

Hier sind ein paar wir besprochen haben:

Klasse-basierte SQL Gebäude

Dies würde bedeuten, eine Klasse zu erstellen, die Sie SQL querys Bit-für-Bit erstellen können. Zum Beispiel:

$stmt = new SQL_Stmt('mysql');
$stmt->set_type('select');
$stmt->set_columns('*');
$stmt->set_where(array('id' => 4));
$stmt->set_order('id', 'desc');
$stmt->set_limit(0, 30);
$stmt->exec();

Es tut beinhaltet eine ganze Reihe von Linien für eine einzelne Abfrage though.

SQL-Syntax Neuformatierung

Diese Option ist viel sauberer - es SQL-Code lesen würde und es auf der Grundlage der Ein- und Ausgangssprachen umformatieren. Ich sehe dies als weit eine viel langsamere Lösung ist als Parsing jedoch geht.

War es hilfreich?

Lösung

würde ich empfehlen, klassenbasierte SQL Gebäude und empfehlen Lehre Zend_Db oder MDB2 . Und ja, wenn es mehr Linien erfordert einfach wählt zu schreiben, aber zumindest bekommen Sie auf einen Parser verlassen und müssen nicht das Rad neu erfinden.

jeden DBAL Verwendung ist ein Kompromiss in der Geschwindigkeit, und zwar nicht nur Datenbank Ausführung, aber das erste Mal, wenn Sie eine dieser beide verwenden wird es schmerzhaft sein, als wenn Sie mit ihm wirklich vertraut sind. Auch ich bin fast 100% sicher, dass der Code generiert ist nicht die schnellste SQL-Abfrage, aber das ist der Trade-off ich früher gedacht.

Am Ende liegt es an dir, so dass, obwohl ich es nicht tun würde, und es ist sicher nicht unmöglich ist, bleibt die Frage, ob Sie tatsächlich Zeit und Ressourcen (auf lange Sicht) speichern können, indem Sie Ihre eigenen DBAL implementieren.

Andere Tipps

Eine Lösung könnte sein, verschiedene Arten von Anfragen für verschiedene Plattformen mit IDs so etwas wie

hat

MySql: GET_USERS = "SELECT * FROM users"

MsSql: GET_USERS = ...

PgSql: GET_USERS = ...

Dann beim Start laden Sie die benötigte Menge von Abfragen und bezieht sich dann

Db :: loadQueries (Plattform):

$ users = $ db-> query (GET_USERS)

Eine solche Regelung würde nicht berücksichtigt all den Reichtum der SQL bietet, so dass Sie für jede DB besser mit Code-generierte gespeicherte Prozeduren für alle Tabellen sein.

Auch wenn Sie parametrisierte gespeicherte Prozeduren verwenden, die mehr Datenbankmodell-aware sind (das heißt, sie tun beitritt oder sind vom Benutzer bewusst und so werden für jeden Lieferanten optimiert), das ist immer noch ein großer Ansatz. Ich sehe immer die Datenbank-Interface-Schicht als mehr als nur einfache Tabellen für die Anwendung bereitstellt, weil dieser Ansatz mit hohen Bandbreite und Roundtrip verschwenderisch sein kann.

Wenn Sie eine Reihe von Backends haben, die es unterstützen, würde ich zustimmen, dass gespeicherte Prozeduren zu erzeugen, einen Vertrag zu bilden, ist der beste Ansatz. Dieser Ansatz ist jedoch nicht funktioniert, wenn Sie ein Back-End haben, die in capabilty in Bezug auf gespeicherte Prozeduren, in dem Fall, dass Sie eine abstaction Schicht SQL zu implementieren bauen beschränkt ist oder zielspezifische SQL basiert auf einer abstrakten / begrenzte SQL-Syntax zu erzeugen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top