2009-06-04 8 views
5

Estoy contemplando el cambio (principalmente debido a la licencia más permisiva), y tiendo a escuchar muchas murmuraciones de Internet sobre cuánto mejor es Postgres que MySQL, pero no muchos detalles. ¿Qué haces en Postgres que te hace más productivo o te parece elegante?Desarrolladores web que han realizado el cambio de MySQL, ¿de qué características de postgresql no podrían prescindir?

No tiene por qué ser de lujo, por ejemplo, algunas de mis cosas favoritas de MySQL incluyen

  • clave principal fácil incrementando con incremento automático (tener que escribir un generador para cada mesa parece más de un dolor de que debería ser para tal requisito común),
  • "LIMIT, OFFSET" declaraciones (hace para facilitar la paginación)
  • eN DUPLICADO KEY UPDATE (hace que la inserción/actualización de "muchos a muchos" tablas rápido y sin dolor)
+0

No he usado Postgres pero recientemente he estado trabajando con Oracle después de años de usar MySQL exclusivamente. Tienes razón, AUTOINCREMENT en rocas MySQL, es un gran dolor tener que crear secuencias para cada tabla por separado y luego tener que insertar seq.nextval en lugar de simplemente usar NULL para insertar e incrementar el índice. –

+4

De hecho, no has usado Postgres. Hay un azúcar pseudo-type/syntax llamado "SERIAL" que es tan fácil de usar como AUTO_INCREMENT. –

Respuesta

4

PostgreSQL 's características más útiles (que MySQL carece), en mi opinión, son los siguientes:

  • generate_series y establecer las funciones que retornan, en general, la capacidad
  • utilizar valores correlacionados en LIMIT y OFFSET cláusulas
  • personalizados agregados
  • DISTINCT ON cláusula
  • más avanzados JOIN métodos (MERGE JOIN una d HASH JOIN)

Puede hacer maravillas con ellos.

PostgreSQL código también a menudo se ve más elegante (tenga en cuenta que "ve" no significa "realiza"), ya que se puede utilizar la sintaxis de fundición agradable (::), agradables RECORD tipos y este tipo de cosas.

Los inconvenientes son:

  • No se pueden utilizar las sugerencias (Sé que es intencional; sé que debe ser evitado; va me downvote)
  • no puede utilizar variables de sesión que no tienen acceso a los archivos de configuración del servidor (que es necesario configurar custom_variable_classes)
  • DISTINCT y GROUP BY operaciones son laggy.

Dado que ambos sistemas son bastante poderosos y están bien desarrollados, difieren principalmente en características tan sofisticadas (que la mayoría de los desarrolladores nunca usan).

Para básico SQL, ambos son buenos.

+1

MySQL admite funciones agregadas personalizadas escritas en C. SQL sería mejor. –

+0

@Andrew: claro, pero es una pena instalarlos en un alojamiento compartido o utilizarlos en aplicaciones web distribuidas. Buen punto, sin embargo. – Quassnoi

3
  • transaccional DDL - que puede hacer "start transaction; delete table foo; rollback;" y foo todavía estará allí.
+0

¿En qué tipo de escenarios de desarrollo web se encuentra utilizando esta función? – Dylan

+2

Lo uso como una medida de seguridad casi cada vez que tengo que modificar una base de datos de producción, para asegurarme de que no hago algo estúpido por error. Simplemente presiona "confirmar" cuando hayas terminado; si no, siempre puedes retroceder. – Arnaud

0

PostgreSQL, a través de PostGIS, ofrece un soporte muy rico para operadores geoespaciales.Es difícil imaginar hacer cualquier tipo de integración de mapas de Google (o trabajo geoespacial similar) con cualquier otro DB.

+0

@TokenMacGuy: MySQL también admite la operación espacial: http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html – Quassnoi

+0

Las operaciones espaciales de MySQL solo funcionan en MyISAM, lo que obliga a utilizar un sistema obsoleto, lento , motor no ACID. – peufeu

0
  • almacenados Procedimientos/UDF en Perl
  • asíncrona de base de datos de acceso en libpq
  • esquemas y bases de datos, no a las bases de datos que pretenden ser esquemas
  • GIN y GIST
0

Adición de cheques a los campos. Por ejemplo:

CREATE TABLE "FILES" (
    ... 
    md5checksum text NOT NULL, 
    CONSTRAINT "FILES_md5checksum_check" CHECK ((md5checksum ~* '^[a-f0-9]{32}$'::text)), 
    ... 
); 

md5checksum campo ahora es siempre valida que es cadena hexadecimal y es de 32 caracteres.

Cuestiones relacionadas