MongoDB + PHP

Click here to load reader

  • date post

    29-Jul-2015
  • Category

    Software

  • view

    130
  • download

    0

Embed Size (px)

Transcript of MongoDB + PHP

1. Apresentao: Ari Stopassola Junior @stopassola 2. Bacharel em Informtica com nfase em Anlise de Sistemas pela Unisinos, cursou mestrado em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico da Universidade Tcnica de Lisboa (Portugal), perito judicial ad hoc especializado em TI (mantenedor do site PERITO.inf.br), Zend Certified Engineer (PHP 5.3) e Zend Certified PHP Engineer (PHP 5.5) #ZEND004019, Certified ScrumMaster pela Scrum Alliance #203613, Microsoft Certified Professional (MCP), idealizador do projeto Certificamp, consultor web e PHP evangelist. Ari Stopassola Junior 3. Roadmap conceito de bases de dados NoSQL cases comparaes com o modelo relacional expresses SQL x MongoDB (orientado documentos) instalao recursos do MongoDB operaes via console modelagem: embedded, manual e DBRef driver PHP anatomia do cdigo PHP CRUD (Create, Read, Update and Delete) ObjectId operadores segurana persistncia de objetos tratamento arrays (documentos aninhados) ndices (performance) projeo hospedagem (PaaS) novidades da verso 3 ferramentas de administrao programa de certificao 4. NoSQL Not Only SQL (poderia ser NOSQL) Movimento de bancos de dados no relacionais Tambm chamados: Modelo Relacional No Normalizado (MRNN) Seria mais apropriado dizer ento No relational pois alguns SGBDs possuem interface SQL, embora sejam categorizados como NoSQL. Ex.: OrientDB 5. Taxonomia das bases NoSQL Documento (XML ou JSON) RavenDB, CouchDB, MongoDB Orientado a Objetos Db4o Chave/Valor (Key/Value) Redis, SimpleDB, Hbase, MemcacheDB, Riak, Berkeley DB Tabular (inspirado no BigTable do Google) Cassandra (Apache), Hypertable, Hbase Orientado a colunas (relacionais com caractersticas NoSQL) Vertica, MonetDB, LucidDB, Infobright Grafos (Graph) Neo4j, OrientDB, Titan, DEX, InfiniteGraph, InfoGrid, HyperGraphDB Outros Chordless, Mnesia Fonte: http://pt.wikipedia.org/wiki/NoSQL 6. Quem usa NoSQL? eBay (pioneiro) New York Times Foursquare Electronic Arts GitHub SAP Disney Twitter Fifteen months ago, It took two weeks to perform ALTER TABLE on the statuses [tweets] table. (setembro/2010) Fonte: http://www.mongodb.org/about/production-deployments/ 7. Responsvel por 438 casamentos ao dia nos EUA Algoritmo Compatibility Matching System reduz significativamente o nmero de separaes +51 milhes de usurios Processa 1 bilho de combinaes de casais Sob RDBMS demorava 2 semanas processando Fonte: http://www.mongodb.com/press/mongodb-powers-critical-eharmony-compatibility-application-processing-1-billion-matches-dail-0 http://www.mongodb.com/presentations/big-dating-eharmony 8. Base orientada a documentos Fonte: livro MongoDB and PHP de Steve Francia publicado pela OReilly 9. Por qu? Sistemas Orientados Objetos requer ORM (Object-Relational Mapping) Normalizao precisa de JOINs Complexidade dos relacionamentos Problemas ao escalar: vertical versus horizontal 10. Sharding: escalabilidade Horizontalmente escalvel A LT W ndice C A LT W F Y U P K S V Z 11. Replica set: redundncia 12. Diagrama ER do catlogo de produtos do Magento 13. Modelagem relacional 14. Modelagem Orientada a Documentos Organizao interna 15. AMP 16. MongoDB http://www.mongodb.org Nome vem da expresso huMONGOus que significa extremamente enorme Banco de dados open source: https://github.com/mongodb/ Criado pela 10gen em C++, orientado a documentos (formato JSON/BSON) Escalvel Schemaless (no h colunas ou tipos de dados) JavaScript Object Notation 17. Expresses SQL em MongoDB SQL MongoDB Database Database Table Collection Index Index Row Document Column Field Joining Embedding & linking Partition Shard Fonte: Reference Cards for MongoDB 18. Hierarquia Bancos de dados armazenam colees Colees possuem documentos No contexto PHP, documentos so arrays multidimensionais Do ponto de vista do MongoDB, so estruturas em JSON: Imagem extrada de: http://habrahabr.ru/post/156633 19. Ready, set GO! 20. Instalao manual: OSX e Linux 1) Baixe o binrio do MongoDB em http://www.mongodb.org/downloads Descompacte o arquivo mongodb-osx-x86_64-2.x.x.tgz 2) Renomeie o diretrio (resultado da descompactao) para um nome mais apropriada. Ex.: mongodb 3) Abra o terminal e adicione ao final do arquivo /etc/paths o caminho: sudo vim /etc/paths Adicione a linha (de acordo com o diretrio onde o MongoDB se encontra). Ex.: /Users/ari/mongodb/bin echo "export PATH=$PATH:/Users/ari/mongodb/bin" > ~/.bash_profile 4) Crie diretrios para armazenar as bases. O binrio disponibilizado pela 10gen prev que a base ficar na raiz do sistema operacional: sudo mkdir -p /data/db/ sudo chown `id -u` /data/db 5) Inicie o servio (deamon): ./mongod & 6) Abra a console do MongoDB e realize um teste: mongo > db.passeios.save( { a : 1 } ) > db.passeios.find() sudo ./mongod & (dependendo das permisses de usurio) Mtodo alternativo ao passo 3 21. Instalao: Windows Download (certifique-se da arquitetura: 32 ou 64bit) Descomprimir no C:mongodb-win32-i386-2.x.x Renomear a pasta para C:mongodb Abra o terminal como usurio Administrador Crie o diretrio c:datadb cd .... md data md datadb Execute o deamon do MongoDB: c:mongodbbinmongod.exe Em outra console execute o client: c:mongodbbinmongo.exe Fonte: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/ 22. Driver para PHP https://github.com/mongodb/mongo-php-driver Mantido por Derick Rethans (autor do xDebug e vrios outros projetos significativos): http://derickrethans.nl http://docs.mongodb.org/ecosystem/drivers/p hp/ Foto: http://steve.maraspin.net/photo/gallery/conferences/2012-phpday-verona-italy/ 23. Instalao do driver PHP para mongoDB http://pecl.php.net/package/mongo # sudo pecl install mongo Adicione a linha extension=mongo.so no php.ini http://soupforthegirlysoul.blogspot.com.br/2012/03/sunday-smiles-optimism-opportunists-and.html 24. Habilite a extenso PHP no ZendServer CE 25. Verifique se o mdulo foi habilitado: phpinfo() 26. Documentao antiga A partir da verso 1.3.0 do driver, Derick Rethans mudou o nome da classe de Mongo para MongoClient Mais detalhes no post institulado Mongo is dead, long live MongoClient:http://derickrethans.nl/mong oclient.html 27. phpMoAdmin 1. Acesse: http://www.phpmoadmin.com/ 2. Faa o download do phpmoadmin.zip, descomprima e copie o script moadmin.php para a raiz do Apache coloque uma autenticao (caso deseje) 28. Anatomia do cdigo PHP 29. Conexo //Conecta em localhost:27017 $conexao = new MongoClient(); //Conecta no host remoto na porta default $conexao = new MongoClient("200.248.240.62"); //Host remoto na porta especificada $conexao = new MongoClient("exemplo.com:65432"); $conexao = new MongoClient("localhost:27017", array("username" => "root", "password" => "senha")); 30. Conexo (mais elegante) try { $conexao = new MongoClient(); } catch (MongoConnectionException $e){ die($e->getMessage()); } 31. Base de dados $db = $conexao->nomebase; //Formato alternativo $db = $conexao->selectDB('nomebase'); ATENO: se a base no existir, ela ser criada, portanto certifique-se bem do nome da base. 32. Coleo //Faz referncia a coleo $colecao = $db->clientes; //Formato direto, partindo da conexo $colecao = $conexao->nomebase->clientes; //Formato alternativo $colecao = $db->selectCollection('clientes'); 33. Insero Documento == Array PHP $clientes = array( 'nome' => "Ari Stopassola Junior", 'endereco'=> "Estrada do Carazal, 3744", 'cidade' => "Gramado", 'UF' => "Rio Grande do Sul", 'CEP' => "95670-000" ); $colecao->insert($clientes); 34. Insero: documento dentro de documento$passeio = array( "nome" => "Razes Coloniais", "valor" => 90, "opcionais => array("almoco" => true, "transfer" => true), "observacoes" => "Senhor obeso, portanto reserve dois assentos", "data" => new MongoDate() ); db.passeios.insert({ "nome": "Itaimbezinho", "valor": 120, "opcionais": [ { "almoco": false, "transfer": true, "observacoes": "Vai a famlia toda" } ], "observacoes": "j foi pago", "data": new Date() }) Sob o ponto de vista relacional, no seria possvel inserir um array no campo opcionais. Seria necessrio uma nova tabela (provavelmente at uma terceira tabela, dependendo do nvel de normalizao) para que isso fosse vivel sendo imprescindvel o uso de JOINS 35. Dot notation db.voucher.find({ 'pacotes.passeios.nome': "Tour Uva e Vinho}) 36. Whats happening?! No criamos a base de dados No utilizamos clusulas SQL como : CREATE TABLE, auto_increment, PRIMARY KEY, INDEX etc No utilizamos ALTER TABLE para adicionar novos campos No foi necessrio aplicar JOINS entre entidades Nada de PDO, ORM ou bibliotecas externas 37. Modelagem 38. Quando a entidade tornar-se muito grande, pode-se quebr-la em mais colees Mantm o ObjectID como referncia Esse link deve ser criado manualmente Relao "UM para UM" (abordagem manual) 39. Relao "UM para UM" manual (definio de classes) 55. No salva atributos private e protected class Imoveis{ public $nome; public $endereco; private $reservado; public function __construct($n, $e){ $this->nome = $n; $this->endereco = $e; $this->reservado = true; } } $imoveis[] = new Imoveis("Cabana", "Estrada carazal"); $imoveis[] = new Imoveis("Apto", "Condomnio vale"); $colecao->insert($imoveis); Fatal error: Uncaught exception 'MongoException' with message 'zero-length keys are not allowed, did you use $ with double quotes?' 56. class Clientes{ public $nome; public $trocas; public function __construct($n, array $trocas){ $this->nome = $n; $this->trocas = $trocas; } } class Imoveis{ public $nome; public $endereco; public $reservado; public function __construct($n, $e){ $this->nome = $n; $this->endereco = $e; $this->reservado = true; } } class Trocas{ public $dia; public $imovel; public function __construct(DateTime $d, Im