O documento apresenta as vantagens do uso do PostgreSQL em aplicações PHP comparado ao MySQL, discutindo tópicos como desempenho, segurança, backup e replicação. O autor argumenta que o PostgreSQL oferece mais robustez, confiabilidade e escalabilidade à medida que os sistemas crescem em complexidade.
PHP e PostgreSQL, Dois Elefantes Trabalham muito mais
1. PHP e PostgreSQL,
Dois Elefantes Trabalham muito
mais!
Nome William Felipe Welter
Dez/2015
2. 2
# whoami
➢ Bacharel em Ciência da
Computação;
➢ Gerente da equipe de
desenvolvimento da 4Linux;
➢ Experiência com
desenvolvimento (PHP e C) e
infraestrutura.
Nome
William Felipe Welter
3. 3
Conhecendo a 4Linux
➢ Metodologia IT Experience -
Cenários reais
➢ Cursos práticos, rápidos e baratos de
autores feras: www.4shot.com.br
➢ Projetos complexos de missão crítica,
com infra e desenvolvimento PHP
4. 4
Alguns dos nossos clientes
A 4Linux suporta o ecossistema de
software livre da Caixa. Um dos maiores
cases do mundo.
Clientes que confiam na qualidade dos serviços
da 4Linux.
10. 10
PHP e PostgreSQL
➢ Lançados juntos (PHP ~94 / MySQL ~95);
➢ MySQL tinha porte para Windows;
➢ PostgreSQL passou a ter porte para Windows a partir da
versão 8.0 (2005);
➢ Não tinha integridade referencial (MyISAM);
➢ Pouca configuração;
➢ Maioria dos webhosts adotaram.
11. 11
PHP e PostgreSQL
Por que você
usa MySQL? Minha aplicação
é pequena. Por
isso, resolvi
usar o MySQL.
Quando crescer
penso em outro
banco...
26. 26
PHP e PostgreSQL
➢Derivou, originalmente, do projeto Ingres;
➢Iniciou-se, em 1974, na universidade de Berkeley;
➢Outros projetos derivados: Sybase, SQL Server,
NonStop SQL;
➢Linguagem SQL introduzida em 1994.
Um pouco de história:
27. 27
PHP e PostgreSQL
➢Licença é BSD-style;
➢Não tem uma empresa dona do projeto;
➢Projeto é livre!
➢Preza por estabilidade em favor de novas
funcionalidades “da moda”;
➢Segue a risca ao padrão ANSI-SQL 2008.
Principais características:
39. 39
PHP e PostgreSQL
➢Views materializadas:
➢Consultas complexas e lentas;
➢Reutilizadas;
➢Comporta-se com uma tabela quando utilizado em
consultas;
➢Permite criação de índices;
➢Pode ser atualizada.
41. 41
PHP e PostgreSQL
➢Suporte a grupos e herança de privilégios (ROLES);
➢Suporte a múltiplos schemas;
➢Autenticação baseada em hosts (HBA);
➢Suporta o PAM;
➢Bancos são completamente isolados;
➢Granularidade de privilégios.
43. 43
PHP e PostgreSQL
➢Dump:
➢A quente, sem locks;
➢Textual ou binário;
➢O dump e restauração pode ser paralelizados;
➢PITR:
➢Backup continuo, a nível transacional;
➢A quente.
51. 51
PHP e PostgreSQL
➢Conversão automática de tipos:
mysql> CREATE TABLE notas (
id integer primary key auto_increment,
alu_id integer not null,
description varchar(150),
grade float not null
);
mysql> INSERT INTO notas(alu_id,description,grade)
VALUES
( 'fulano', 'Nota da primeira fase', 4.4);
mysql> SELECT * FROM notas;
+----+--------+-----------------------+-------+
| id | alu_id | description | grade |
+----+--------+-----------------------+-------+
| 1 | 0 | Nota da primeira fase | 4.4 |
+----+--------+-----------------------+-------+
52. 52
PHP e PostgreSQL
mysql> CREATE TABLE answer (
id integer primary key,
alu_id integer not null,
answer varchar(100),
date timestamp not null
)
mysql> INSERT INTO answer ( alu_id,answer, date)
VALUES (1,'Thi is ..','08/07/15');
mysql> SELECT * FROM answer;
+----+--------+-----------+---------------------+
| id | alu_id | answer | date |
+----+--------+-----------+---------------------+
| 0 | 1 | Thi is .. | 2008-07-15 00:00:00 |
+----+--------+-----------+---------------------+
53. 53
PHP e PostgreSQL
➢ < 5.6.7, perda de integridade referencial com alter table.
➢ => 5.6.7, bloqueia alter table em colunas com foreign key.
mysql> CREATE TABLE notas (
id integer primary key auto_increment,
alu_id integer,
description varchar(150),
grade float not null,
constraint alu_id_fk
foreign key (alu_id) references alunos(id)
);
mysql> ALTER TABLE notas CHANGE alu_id alu_id integer not
null;
ERROR 1832 (HY000): Cannot change column 'alu_id': used in a
foreign key constraint 'alu_id_fk'
54. 54
PHP e PostgreSQL
➢Comportamento no PostgreSQL:
fisl=# CREATE TABLE notas (
id serial primary key,
alu_id integer references alunos(id),
description varchar,
grade float not null
);
fisl=# ALTER TABLE notas ALTER COLUMN alu_id SET not null;
ALTER TABLE
fisl=# ALTER TABLE notas ALTER COLUMN alu_id DROP not null;
ALTER TABLE
fisl=# INSERT INTO notas ( description, grade) VALUES
('asdfasdfa',5.5);
INSERT 0 1
fisl=# ALTER TABLE notas ALTER COLUMN alu_id SET not null;
ERROR: column "alu_id" contains null values
55. 55
PHP e PostgreSQL
➢ Sintaxes não implementadas, são aceitas silenciosamente:
mysql> create table notas (
id integer primary key auto_increment,
alu_id integer references alunos(id),
description varchar(150),
grade float not null
);
Query OK, 0 rows affected (0,59 sec)
mysql> desc notas;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| alu_id | int(11) | YES | | NULL | |
| description | varchar(150) | YES | | NULL | |
| grade | float | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
56. 56
PHP e PostgreSQL
➢ GROUP BY, colunas sem agregação = resultado
indeterminado:
Ex3:
mysql> select * from notas;
+----+--------+-------------+-------+
| id | alu_id | description | grade |
+----+--------+-------------+-------+
| 1 | 1 | teste | 2.2 |
| 2 | 1 | teste2 | 2.2 |
| 3 | 1 | fulano | 2.2 |
| 4 | 1 | fulano | 3 |
+----+--------+-------------+-------+
4 rows in set (0,00 sec)
mysql> select * from notas group by alu_id ;
+----+--------+-------------+-------+
| id | alu_id | description | grade |
+----+--------+-------------+-------+
| 1 | 1 | teste | 2.2 |
+----+--------+-------------+-------+
1 row in set (0,00 sec)
57. 57
PHP e PostgreSQL
➢Comportamento no PostgreSQL:
fisl=> select * from notas;
id | alu_id | description | grade
----+--------+-------------+-------
2 | 1 | asdfasdfa | 5.5
3 | | asdfasdfa | 5.5
4 | 1 | fulano | 4.3
5 | 1 | fulano | 8
6 | 2 | ciclano | 9
(5 rows)
fisl=> select * from notas group by alu_id;
ERROR: column "notas.id" must appear in the GROUP BY clause or
be used in an aggregate function
58. 58
PHP e PostgreSQL
fisl=> select alu_id,count(*) as total from notas group by alu_id;
alu_id | total
--------+-------
| 1
1 | 3
2 | 1
65. 65
PHP e PostgreSQL
➢Métodos idênticos ao MySQL:
<?php
$db = new PDO('pgsql:host=localhost;dbname=fisl','fisl','123456');
$result=$db->query('SELECT * FROM alunos');
$data=$result->fetchAll(PDO::FETCH_ASSOC);
print_r($data);
66. 66
PHP e PostgreSQL
➢PDO::lastInsertId('nomedasequence'):
<?php
$db = new PDO('pgsql:host=localhost;dbname=fisl','fisl','123456');
$stmt=$db->prepare('INSERT INTO alunos(name) VALUES (?)');
$stmt->execute(array('Felipe'));
$id = $db->lastInsertId('alunos_id_seq');
echo $id;
67. 67
PHP e PostgreSQL
➢Nome padrão das sequences: table_column_seq;
➢Como identificar o nome de uma sequence?
68. 68
PHP e PostgreSQL
fisl=> d notas
Table "public.notas"
Column | Type | Modifiers
-------------+-------------------+----------------------------------------------------
id | integer | not null default nextval('notas_id_seq'::regclass)
alu_id | integer |
description | character varying |
grade | double precision | not null
Indexes:
"notas_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"notas_alu_id_fkey" FOREIGN KEY (alu_id) REFERENCES alunos(id)