NoSQL com Zend Framework 2

Post on 10-Jan-2017

585 views 0 download

Transcript of NoSQL com Zend Framework 2

NoSQL com Zend Framework 2

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

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.

Autor de

20132012201020092008

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

Saindo do forno...

E em breve...

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

Criando Aplicações PHP com Zend e ExtJS

Autor também de

http://www.perse.com.br

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

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.

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.

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)

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.

Bancos de Dados NoSQL

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

Todos são suportados por PHP.

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.

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.

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.

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

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.

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

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

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

Mas...

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

Desempenho

Escalabilidade

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

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.

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.

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

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 >

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)

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

)

*/

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

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

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

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

?>

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.

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

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

)

*/

?>

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

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.

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

?>

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

?>

E o Zend Framework 2?

CACHE

SESSÃO

https://github.com/doctrine/DoctrineMongoODMModule

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>