Boas práticas de programação com Object Calisthenics
NoSQL com Zend Framework 2
1. NoSQL com Zend Framework 2
Flávio Gomes da Silva Lisboa
www.fgsl.eti.br
2. Quem sou eu?
● Bacharel em Ciência da Computação com pós-graduação em Aplicações
Corporativas usando Orientação a Objetos e Tecnologia Java pela
Universidade Tecnológica Federal do Paraná. Programador formado pelo
Centro Estadual de Educação Tecnológica Paula Souza.
● Chefe do setor de adequação da solução e mobilidade do projeto Expresso
3 na Coordenação Estratégica de Ações Governamentais do Serviço
Federal de Processamento de Dados (Serpro).
● Zend PHP Certified Engineer, Zend Framework Certified Engineer e Zend
Framework 2 Certified Architect.
8. Programação (← →)
Nesta palestra aprenderemos a utilizar a
abstração de MongoDB do PHP para persistir
dados no lugar do componente ZendDb em
aplicações PHP orientadas a objeto utilizando
Zend Framework 2.
9. Bancos de Dados Relacionais
O banco de dados relacional é a arquitetura mais comum e
difundida para organização de dados estruturados. O conteúdo
é armazenado em tabelas e acessado através de uma linguagem
especialista, SQL. Em muitos casos, uma interface gráfica de
usuário é disponibilizada para simplificar a interação com os
bancos de dados.
Sistemas gerenciadores de bancos de dados relacionais
comumente usados em aplicações Web incluem Oracle
(proprietário), SQL Server (proprietário), MySQL/MariaDB (software
livre), PostgreSQL (software livre) e SQLite (domínio público).
Todos são suportados por PHP.
10. Bancos de Dados Relacionais:
ACID
Além de implementar funções CRUD (usando SQL), transações em
bancos de dados relacionais são ACID:
Atômicas: tudo ou nada. Se uma parte da transação falha, tudo falha
Consistente: cada transação pode mover um banco de dados
somente entre estados válidos
Isoladas: cada transação em processo mas não finalizada será
isolada de outras transações
Duráveis: uma vez que uma transação tenha sido efetivada, suas
mudanças serão refletidas no banco de dados (isso inclui sobreviver a
uma quebra do sistema)
11. Bancos de Dados NoSQL
Bancos de dados NoSQL armazenam os dados
em um formato livremente estruturado e não
fornece (tipicamente) o mesmo nível de controle
(no nível do banco de dados) sobre os resultados
retornados (por exemplo, ordenação). Eles são
com frequência altamente otimizados para
simples operações de recuperação e
persistência, com o objetivo de alta
performance.
12. Bancos de Dados NoSQL
Sistemas gerenciadores de bancos de dados NoSQL
comumente usados em aplicações web incluem:
Todos são suportados por PHP.
13. Bancos de Dados de Arquivos
Simples
Bancos de dados de arquivos simples armazenam os
dados em arquivos de texto... simples (como arquivos .txt).
Você normalmente precisará desenvolver as funções
CRUD para interagir com seu armazenamento de dados e
enquanto garante a segurança dos dados armazenados.
Banco de dados de arquivos simples são tipicamente
usados somente quando outras soluções não estão
disponíveis ou em circunstâncias onde a complexidade
da aplicação a ser desenvolvida é mínima.
14. Bancos de Dados XML
XML é uma linguagem de marcação que define
um conjunto de regras para codificar documentos
em um formato que é tanto legível por humanos
quando por máquinas. XML pode ser usada
para armazenar dados estruturados em
arquivos de texto e as funções DOM do PHP
permitem interagir facilmente com a árvore de
documento.
15. Camadas de Abstração
Aplicações web tipicamente suportam mais do que um banco
de dados, tipicamente através do uso de módulos de
abstração ou clases de abstração.
Isso permite usar a mesma base de código com diferentes
bancos de dados – sem necessidade de desenvolver
novamente.
Por exemplo, o projeto Drupal suporta nativamente
MySQL/MariaDB, PostgreSQL ou SQLite, e suporta SQL
Server, Oracle e MongoDB com módulos adicionais.
16. Camadas de Abstração em PHP
Camadas de abstração amplamente usadas no PHP
incluem:
PDO: suportado por uma extensão PHP
ODBC: suportado por uma extensão PHP (amplamente
usada para interagir com bancos de dados em ambientes
Microsoft)
Doctrine: suportado por extensões e módulos PHP
Zend DB: suportado por extensões e módulos PHP
17. Camadas de Abstração X Funções Nativas
Camadas de abstração suportam portabilidade de código.
Quando desenver (corretamente) usando uma camada de
abstração, você pode substituir seu sistema gerenciador de
banco de dados.
Por exemplo, você pode codificar uma aplicação usando MySQL
como um back-end e então colocá-la em produção em um back-
end Oracle.
Qualquer camada de abstração que você decidir usar trará
um custo em termos de desempenho.
18. O que há de errado com os Sistemas
Gerenciadores de Bancos de Dados Relacionais?
19. O que há de errado com os Sistemas
Gerenciadores de Bancos de Dados Relacionais?
● Nada, para a maioria das aplicações web.
20. Mas...
E quanto às poucas aplicações web muito muito
muito grandes, como estas:
25. MongoDB
MongoDB (de "huMONGOus" – talvez a combinação de 'huge' +
'monstrous') é um banco de dados NoSQL de código aberto.
MongoDB foi originalmente desenvolvido pela 10gen, uma empresa
criada por Eliot Horowitz e Dwight Merriman (o fundador do
DoubleClick).
Os objetivos do MongoDB eram:
● Reter muitas das funcionalidades de sistemas de gerenciamento de
bancos de dados relacionais.
● Permitir escalabilidade horizontal.
● Garantir uma interface "elegante" para desenvolvedores
26. O básico do MongoDB
Um documento é a unidade básica de dados para o
MongoDB (é similar a um registro em um banco de
dados relacional)
Uma coleção é um grupo de documentos (é o
equivalente livre de esquema de uma tabela em um
banco de dados relacional)
Uma única instância de MongoDB pode hospedar
múltiplos bancos de dados independentes, cada um
dos quais tem suas próprias coleçõs e permissões.
27. Como e quando usar MongoDB
MongoDB é usado para aplicações web de larga
escala. Na maioria das vezes para armazenar
dados estruturados na forma de objetos – mas
ele é muito mais poderoso.
28. Instalando MongoDB
Dois passos são requeridos: o primeiro é instalar o servidor de
banco de dados, o segundo é instalar o módulo PHP.
Enquanto quase nenhuma configuração é necessária para
instalar MongoDB, instalar o módulo PHP requer familiaridade
com as configurações do arquivo php.ini.
Esteja ciente de que MongoDB pode facilmente crescer usando
vários GBs – você pode ter de customizar seu arquivo de
configuração se quiser obter desempenho para espaço em disco
(tipicamente em máquinas de desenvolvimento).
29. Usando MongoDB
MongoDB pode ser usado:
● A partir da linha de comando
● A partir do PHP
● Usando algum sistema de gerenciamento de
banco de dados
●MongoDB shell version: 2.4.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
>
30. Conectando a um servidor de banco
de dados MongoDB
Para conectar com o MongoDB a partir do PHP,
você precisa criar um objeto Mongo, passando
nome de usuário, senha, servidor e porta e o
nome do banco de dados.
O servidor padrão é localhost, e a porta padrão é
27017 (você não precisa normalmente mudar
esses parâmetros)
31. Conectando a um servidor de banco
de dados MongoDB
<?php
$connection = new
MongoClient("mongodb://username:password@localhost/database_name");
print_r($connection);
/*
Mongo Object
(
[connected] => 1
[status] =>
[server:protected] =>
[persistent:protected] =>
)
*/
32. Selecionando um banco de dados
Uma vez que você tenha estabelecido a conexão com o servidor de
banco de dados, você a usará para acessar um banco de dados:
<?php
$db = $connection->dbname; // opens the database
dbname
?>
Se você tem direitos administrativos para o MongoDB e o banco de
dados não existir, o MongoDB automaticamente criará um novo banco
de dados para você.
33. Criando/Selecionando uma Coleção
Uma vez que você tenha acessado um banco de dados, você
pode selecionar uma coleção:
<?php
$collection = $db->addresses;
?>
Equivalente ao console do MongoDB,
db.createCollection('addresses');
34. Armazenando um objeto
MongoDB é usado para armazenar objetos e documentos:
<?php
// creating an array
$student1 = array(student_id => "u1111111",
module_name => "im2801", mark => 41);
collection->insert($student1);
?>
Equivalente ao console do MongoDb,
db.addresses.insert({'student_id' : 'u1111111',
'module_name' : 'im2801', 'mark' : 41});
36. Chaves primárias e object ids
MongoDB usa identificadores únicos para cada
documento (chamados chaves primárias ou
objectids). A menos que outro comportamento seja
configurado, MongoDB automaticamente criará
objectIds.
O ObjectId é composto de um timestamp, bem como
informação sobre a máquina onde foi criado. Como
um objeto, tem métodos que podem ser invocados.
37. MongoDB: procurando um
documento
O método findOne() é usado para encontrar o
primeiro casamento em uma coleção.
Pode ser chamado sem parâmetros ou usando
um array com os parâmetros.
Equivale ao console do MongoDB,
db.addresses.findOne({"module_name" :
"im2801"});
39. MongoDB: procurando todos os
documentos
<?php
$cursor = $collection->find();
foreach ($cursor as $key => $val)
{
echo "$key: ";
print_r($val);
}
?>
Equivale ao console do MongoDB,
db.[COLLECTION].find();
40. MongoDB: atualizando uma coleção
Você pode usa o método update para atualizar uma coleção. O método update
aceita três parâmetros:
● Um array, especificando a consulta
● Um segundo array, especificando a substituição
● Um terceiro array opcional, com quaisquer opções
MongoCollection::update(array $criteria, array $new_object
[, array $options = array() ])
Por padrão, MongoDB atualizará somente o primeiro casamento no
documento. Para opções avançadas, consulte a documentação.
41. MongoDB: atualizando uma coleção
<?php
// substitui o documento inteiro pelo valor do primeiro array
$collection->update(array("student_id" => "u1111111",
"module_name" => "im2801"), array("mark" => 45));
// apenas muda o valor referido pelo primeiro array
$collection->update(array("student_id" => "u1111111",
"module_name" => "im2801"), array("$set" => array("mark" =>
45)));
?>
42. MongoDB: removendo dados de
uma coleção
Remover dados é tão simples quanto adicionar dados:
<?php
$criteria = array('_id'=> new
MongoId('4ba667b0a90578631c9caea1'));
$collection->remove($criteria,
array("justOne" => true));
?>
50. Referências
● Baravalle, A. PHP and NoSQL. Disponível em
<http://www.baravalle.com/presentations/im2801/lecture9.html>
● Brown, C., DeHayes, D., Hoffer, J., Martin, E. and Perkins, W. (2011) Managing information
technology. 7th edn. New Jersey: Pearson Education. ISBN-10: 0132146320 or ISBN-13: 978-
0132146326.
● Connolly, T. M. and Begg, C. E. (2010) Database Systems: A Practical Approach to Design,
Implementation and Management, 5/E, Pearson/Addison Wesley.
● Harrison, G. 10 things that you should know about NoSQL databases. Disponível em
<http://www.techrepublic.com/blog/10-things/10-things-you-should-know-about-nosql-
databases/>
● High Scalability. What the Heck are people using NoSQL for. Disponível em
<http://highscalability.com/blog/2010/12/6/what-the-heck-are-you-actually-using-nosql-for.html>
● PHP Group. Database Extensions. Disponível em <http://php.net/manual/en/refs.database.php>
● Weil, K. How They use NoSQL in Twitter.Disponível em
<http://www.infoq.com/presentations/NoSQL-at-Twitter>