NoSQL com Zend Framework 2

50
NoSQL com Zend Framework 2 Flávio Gomes da Silva Lisboa www.fgsl.eti.br

Transcript of NoSQL com Zend Framework 2

Page 1: NoSQL com Zend Framework 2

NoSQL com Zend Framework 2

Flávio Gomes da Silva Lisboa www.fgsl.eti.br

Page 2: NoSQL com Zend Framework 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.

Page 3: NoSQL com Zend Framework 2

Autor de

20132012201020092008

http://www.novatec.com.br/autores/flaviogomes/

Page 4: NoSQL com Zend Framework 2

Saindo do forno...

Page 5: NoSQL com Zend Framework 2

E em breve...

Zend Framework Componentes Poderosos para PHP 3ª edição

Criando Aplicações PHP com Zend e ExtJS

Page 6: NoSQL com Zend Framework 2

Autor também de

http://www.perse.com.br

Page 7: NoSQL com Zend Framework 2

Escreve no bloghttp://romocavaleirodoespaco.blogspot.com.br/

Page 8: NoSQL com Zend Framework 2

Programação (← →)

Nesta palestra aprenderemos a utilizar a abstração de MongoDB do PHP para persistir dados no lugar do componente Zend\Db em aplicações PHP orientadas a objeto utilizando Zend Framework 2.

Page 9: NoSQL com Zend Framework 2

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.

Page 10: NoSQL com Zend Framework 2

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)

Page 11: NoSQL com Zend Framework 2

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.

Page 12: NoSQL com Zend Framework 2

Bancos de Dados NoSQL

Sistemas gerenciadores de bancos de dados NoSQL comumente usados em aplicações web incluem:

Todos são suportados por PHP.

Page 13: NoSQL com Zend Framework 2

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.

Page 14: NoSQL com Zend Framework 2

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.

Page 15: NoSQL com Zend Framework 2

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.

Page 16: NoSQL com Zend Framework 2

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

Page 17: NoSQL com Zend Framework 2

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.

Page 18: NoSQL com Zend Framework 2

O que há de errado com os Sistemas Gerenciadores de Bancos de Dados Relacionais?

Page 19: NoSQL com Zend Framework 2

O que há de errado com os Sistemas Gerenciadores de Bancos de Dados Relacionais?

● Nada, para a maioria das aplicações web.

Page 20: NoSQL com Zend Framework 2

Mas...

E quanto às poucas aplicações web muito muito muito grandes, como estas:

Page 21: NoSQL com Zend Framework 2
Page 22: NoSQL com Zend Framework 2

Desempenho

Page 23: NoSQL com Zend Framework 2
Page 24: NoSQL com Zend Framework 2

Escalabilidade

Page 25: NoSQL com Zend Framework 2

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

Page 26: NoSQL com Zend Framework 2

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.

Page 27: NoSQL com Zend Framework 2

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.

Page 28: NoSQL com Zend Framework 2

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).

Page 29: NoSQL com Zend Framework 2

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: testWelcome 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 >

Page 30: NoSQL com Zend Framework 2

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)

Page 31: NoSQL com Zend Framework 2

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] =>

)

*/

Page 32: NoSQL com Zend Framework 2

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ê.

Page 33: NoSQL com Zend Framework 2

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');

Page 34: NoSQL com Zend Framework 2

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});

Page 35: NoSQL com Zend Framework 2

MongoDB: Incluindo dados

<?php

$connection = new Mongo("mongodb://andres:password@localhost");

$collection = $connection->andres->students;

// creating an array

$student1 = array("student_id" => "u1111111", "module_name" => "im2801", "mark" => 41);

$collection->insert($student1);

$student1 = array("student_id" => "u1111112", "module_name" => "im2801", "mark" => 42);

$collection->insert($student2);

?>

Page 36: NoSQL com Zend Framework 2

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.

Page 37: NoSQL com Zend Framework 2

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"});

Page 38: NoSQL com Zend Framework 2

MongoDB: procurando um documento

<?php

$document = $collection->findOne(array("module_name" => "im2801"));

print_r($document);

/*

Array (

[_id] => MongoId Object

(

[$id] => 528c2686eae33e20048b4567

)

[student_id] => u1111111

[module_name] => im2801

[mark] => 41

)

*/

?>

Page 39: NoSQL com Zend Framework 2

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();

Page 40: NoSQL com Zend Framework 2

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.

Page 41: NoSQL com Zend Framework 2

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)));

?>

Page 42: NoSQL com Zend Framework 2

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));

?>

Page 43: NoSQL com Zend Framework 2

E o Zend Framework 2?

Page 44: NoSQL com Zend Framework 2

CACHE

Page 45: NoSQL com Zend Framework 2

SESSÃO

Page 46: NoSQL com Zend Framework 2
Page 47: NoSQL com Zend Framework 2
Page 48: NoSQL com Zend Framework 2
Page 49: NoSQL com Zend Framework 2

https://github.com/doctrine/DoctrineMongoODMModule

Page 50: NoSQL com Zend Framework 2

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>