2010-11-28 29 views
7

estoy creando una pequeña biblioteca activerecord usando DOP y tengo la intención de apoyar MySQL, SQLite y PgSQL.diferencias de sintaxis entre MySQL, SQLite y pgsql

Mi pregunta es cómo puedo estar seguro de que la cadena de consulta funciona con todos los adaptadores? En su mayoría habrá declaraciones de CRUD con algunas combinaciones, etc. ¿Existe un estándar que pueda seguir que funcione para todo esto?

Gracias /Tobias

EDIT: Gracias por todas sus respuestas, pero mi pregunta era más sobre 'sintaxis' diferencias del SQL entre ellos.

+0

seguro. siempre puedes tener la posibilidad de unir tus manos y hacer una sqlite miserable con el poderoso Postgre. –

+1

El problema con este tipo de enfoque es que la aplicación resultante será igualmente lenta en todas las plataformas, especialmente si se trata de una aplicación no trivial. Prefiero tratar de hacer la abstracción en la capa empresarial y explotar las características específicas de DBMS siempre que sea posible en la capa de acceso a datos. –

+0

@a_horse_with_no_name: para cosas como esta, siempre respondía, me mostraba un problema de rendimiento, luego usaba el interruptor para ejecutar consultas regulares. Preocuparse por el rendimiento debido a la capa de abstracción de la base de datos me parece una optimización prematura; e incluso cuando uso una capa de abstracción siempre tengo la opción de ejecutar consultas regulares. –

Respuesta

0

Here tiene una simple introducción a zend_db_adapter - Creo que quieres algo similar (I publicado esto sólo como un ejemplo para ver cómo otros resuelven el problema que tiene)

0

Mi elección para este tipo de problemas sería ADOdb. Aunque nunca lo usé realmente con PostgreSQL, simplemente me salvó la cordura en un proyecto que nació con MySQL y luego migró a SQL Server, a SQLite y de regreso a SQL Server.

2

Si desea escribir su propia capa DB, me ha sugerido:

  1. utilizar marcadores de posición, si no está ya. Añaden seguridad también.
  2. Uso bindParam/bindValue con tipo de valor (por ejemplo booleanos no existen en SQLite, pero funcionan si se vincula con PARAM_BOOL) ...
  3. utilizar procedimientos almacenados de MySQL, crear nombres coincidentes en PostgreSQL, y definirlos en SQLite con sqliteCreateAggregate/sqliteCreateFunction.
  4. Haga todas las comprobaciones de parámetros en PHP, porque SQLite no hará ninguna (por ejemplo, validar variables de fecha) ...
  5. Use InnoDB for MySQL para obtener transacciones.

Nota: Al apoyar estas muy diferentes RDBMs, estás degradando a la base de datos de sólo un almacén de datos. Tenga en cuenta que SQLite es muy limitado. No tiene tipos de datos nativos guardados de número/cadena. P.ej. falta gestión de la fecha e intervalos, y así sucesivamente. Las tres bases de datos admiten transacciones, que son esenciales para la integridad de los datos cuando la integridad se mantiene fuera de la base de datos.

Editar: Se ha eliminado la mención de los desencadenadores de MySQL, que están disponibles para 5.0.

+0

Tanto como prefiero Postgres: MySQL ** does ** have triggers.Pero las claves externas son mucho más adecuadas para garantizar la integridad de los datos. –