16
Ruby on SimpleDB
on December 16, 2007
Bancos de Dados não relacionais é um tema alienígena à grande maioria dos web developers. Na realidade a maioria dos programadores sequer sabe que, o que eles chamam de “banco de dados”, é na realidade um “banco de dados relacional”, ou RDBMS.
A Amazon recentemente anunciou seu novo serviço SimpleDB ou seu database in the cloud. Ele trabalhará em conjunto com o serviço de storage S3 para prover armazenamento e administração de um banco de dados orientado a documentos manipulada através de APIs SOAP. Veja, o SimpleDB não é relacional, não tem schema, portanto não é orientado a colunas.
Chad Fowler acabou de reportar que ele procurou no RubyForge se alguém por acaso já não teria criado algum wrapper para as APIs do SimpleDB e, de fato, elas já existem. Temos os projetos aws-simpledb, o aws-sdb e o simpledb. E quem quiser estudar em detalhes o funcionamento das APIs do SimpleDB, deve ver a documentação? da própria Amazon.
CouchDB
Esse conceito não é novo, os interessados devem conhecer o CouchDB. Essencialmente os conceitos são os mesmos. Coincidentemente ambos foram escritos em Erlang, claro por causa das características de paralelismo inerentes a essa linguagem.
Não sei quanto ao CouchDB mas o SimpleDB é baseado no framework MapReduce do Google, para suportar processamentos absurdamente paralelos de dados em clusters não-confiáveis.
Segundo este site, estas são as características em comum das duas:
- Bancos de dados não relacionais
- Sem schema
- Suporte a replicação de dados
- acessados via HTTP
E agora, onde eles diferem:
| SimpleDB | CouchDB |
| APIs em SOAP e um pseudo-REST | REST |
| chamadas REST usam apenas GET com parâmetros | chamadas REST usam os verbos GET, POST, PUT, DELETE com as semânticas corretas |
| chamadas especificam o banco de dados, registros, atributos, modificadores com parâmetros de query | chamadas especificam o banco de dados e o registro via URL, com parâmetros de query para modificadores |
| criação, atualização e deleção são atômicas ao nível individual de atributos | criação, atualização e deleção são atômicas |
| todos os dados são considerados strings UTF-8 | suporta todos os tipos de dados JSON (string, number, object, array, true, false, null) |
| automaticamente indexa dados | índices estão no controle do usuário, por ‘views’, definidas com funções Javascript, podem ser armazenadas como documentos, podem ser executadas a qualquer momento, como views temporárias |
| queries são limitadas a 5 segundos, com timeout, definidas com parâmetros de query HTTP, compostas de booleanos e conjuntos de operações com alguns operadores óbvios (=, !=, >, etc) | queries são essencialmente views, com a adição de modificadores (start_key, end_key, count, descending) fornecidas como parâmetros de query HTTP |
| como os valores são string UTF-8, não há opções de ordenação | ordenação é flexível e arbitrariamente complexa, já que é baseada em tipos de dados JSON definidas nas views |
| respostas são em XML | respostas são em JSON |
Se quiser pesquisar um sistema parecido com o serviço SimpleDB, o CouchDB é uma excelente opção. E ela tem bindings para diversas linguagens, incluindo nosso Ruby, através do CouchDb-Ruby.
Copiando o exemplo do seu Wiki, eis como se criaria um banco de dados no CouchDb:
1 2 3 |
server = Couch::Server.new("localhost", "5984") server.put("/foo/", "") |
Eis como se criaria um documento:
1 2 3 4 5 6 |
server = Couch::Server.new("localhost", "5984") doc = <<-JSON {"type":"comment","body":"First Post!"} JSON server.put("/foo/document_id", doc) |
E finalmente, como se busca um documento:
1 2 3 4 |
server = Couch::Server.new("localhost", "5984") res = server.get("/foo/document_id") xml = res.body |
Rails utiliza ActiveRecord, mas podemos facilmente substituir o ActiveRecord da mesma forma como já fazemos com ActiveResource, portanto não vejo porque não poderíamos ter algumas aplicações usando CouchDB ou SimpleDB como back-end. Alguém se habilita? :-)
Divagando pela História
Esse assunto me interessa porque diferente da geração atual mais jovem de programadores, eu comecei com banco de dados não relacionais há quase 20 anos. Conheci programadores que lidaram com o supra-sumo dos bancos de dados. Se você perguntar a qualquer jovem programador quais os melhores bancos de dados do mundo ele dirá: Oracle – e se for um xiita open source, talvez PostgreSQL. Não que esse bancos não sejam bons, pelo contrário. Porém, ainda são bebês na infância se compararmos com os bancos de dados realmente robustos que rodam há 40 anos ininterruptos como o IMS da IBM. Todo mundo já ouviu falar de COBOL, mas eis o back end com o qual ele lida: um banco de dados hierárquico não-relacional (e não vamos esquecer do CICS, claro, mas gerenciadores transacionais são outro assunto, e o único com que trabalhei foi o Tuxedo)).
Tenho um grande amigo, ex-IBM, que lidou diretamente com esse tipo de sistema. Ele não vê graça nenhuma no que nós fazemos hoje. O que sempre me dizia: nós já fazíamos essas coisas 20 ou 30 anos atrás. Quer dizer, não sei porque tanta empolgação em conceitos que já são tão velhos. Muita gente não sabe, mas a IBM dos anos 60 e 70 criou basicamente tudo que conhecemos hoje como “tecnologia moderna”: sistemas distribuídos, sistemas operacionais com compartilhamento de tempo, gerenciadores transacionais, bancos de dados hierárquicos, bancos de dados relacionais, e-mail, etc.
Inovação científica (não trivialidades de consumo) necessariamente vem de laboratórios bem estabelecidos e financeiramente fortes. IBM, AT&T, Bell Labs, universidades como Berkeley, MIT, vêm à mente. Basicamente a computação moderna saiu desses institutos.
Também conheci muitos consultores de outras tecnologias que ainda existem e se alguém trabalhar em algum grande banco, ou agências governamentais, talvez ainda encontre o bom e velho banco de dados Adabas. Ele provavelmente foi o primeiro banco de dados comercial, criado em 1970. Mas o nome mais conhecido é a linguagem para manipular seus dados, o NATURAL. Já recebi algumas propostas de Natural alguns anos atrás. Esse produto é da Software AG, empresa alemã que fornecia o banco para ninguém menos que a SAP AG (se não me engano, as duas empresas ficavam em lados opostos da mesma rua). Então, a SAP adquiriu o Adabas, rebatizando-o de SAP DB. Até que recentemente esse banco se tornou o MaxDB, que hoje faz parte da família MySQL, e este nome sim, garanto que os jovens de hoje reconhecem.
Outra plataforma que poucos ouvem falar mas vira e mexe eu vejo ou recebo proposta de trabalho: o banco de dados orientado a objetos Caché. Sua principal características: dizem que é o banco mais rápido do mundo (até agora), com seu sistema de estruturas de dados hierárquico em arrays multidimensionais. Nunca notei se havia um nicho de mercado que prefere Caché, mas a InterSystem tem outro produto construído sobre o Caché chamado Ensemble. Recentemente participei de um projeto que substitui o Ensemble de uma grande telecom para SAP.
Num outro nicho, o mercado de saúde, hospitais, além do Ensemble outro produto que fazia sucesso na sua época foi o bom o velho MUMPS. Conheci um consultor de MUMPS uma vez que migrou para SAP. Pensem assim: MUMPS veio ANTES de C, portanto, diferente das linguagens imperativas atuais, ele não é inspirado em C. A sintaxe parece meio alienígena mas é interessante dar uma olhada.
Meu primeiro ‘banco de dados’, obviamente, foi em Basic. Claro, o mais rudimentar de todos os bancos: uma estrutura de dados de tamanho fixo, um arquivo binário, e navegaçao baseada em offset a partir do tamanho da estrutura, mais um pequeno índice para navegar mais rapidamente. Com 11 ou 12 anos, não se pode exigir mais do que isso. E eu não tinha acesso a grandes mainframes, claro, então IMS era algo que eu só ouviria falar anos depois.
Mas rapidamente migrei para dBase III, da Ashton_Tate. O pessoal que desenvolveu o dBase, da Jet Propulsion Labs (NASA) fez por brincadeira, para rodar sobre CP/M e depois vendeu para a Ashton-Tate. Para quem não se lembra, o antigo MS-DOS é um clone (mal-feito, claro) de CP/M. Naquela época tínhamos vários clones, como PC-DOS e DR-DOS. Coisas que gostava dessa época: eu não tinha nem idéia do que eram estrutura relacional, nem estrutura hierárquica. Para mim haviam apenas tabelas (DBF) e índices (NDX, IDX). Sabia existia redes locais, token ring, compartilhamento de arquivos via Netware, IPX/SPX e que DBFs tinham locks baseadas em tabela para que várias pessoas pudessem utilizar quase ao mesmo tempo. Também, sabia que essas estrutura tendiam a se corromper com extrema facilidade e me perguntava como elas conseguiam funcionar :-)
Rapidamente migrei para Clipper Autumn 86 (que estava no fim e eu lembro que tinha sérias limitações de memória no linkeditor, o limite de 500kb) e para o Clipper Summer 87, da Nantucket. O Clipper começou como um compilador de dBase III. Fiz muitos sisteminhas em Clipper e no começo dos anos 90 migrei para FoxPro. Nessa época esse mercado ficou meio conturbado, a Ashton-Tate foi adquirida pela Borland, a Nantucket foi absorvida pela Computer Associates e a Fox foi para as asas da Microsoft. O Windows ainda estava apenas começando a se popularizar, todas elas lançaram algum produto gráfico, como o Visual dBase, CA-Visual Objects e o Visual FoxPro, respectivamente.
Foi quando comecei a largar o mercado baseado em derivados de dBase e foi para Pascal e Delphi. Mas isso é outra história ;-)





Mas eis que eu me espanto com o tanto de “mas eis” neste artigo :-)
Opa akita beleza,
Interessante seu histórico, o diretor do setor de processamento de dados onde trabalho, começou pelo Clipper. Depois ele procurou uma forma para substituir o clipper, nessa época muitos correram para soluções e interfaces baseadas em Delphi, mas ele foi num congresso onde apresentaram a ferramente FoxPro e depois transformou-se em VisualFoxPro e estamos usando ela até hoje. O diferencial dela é a performance e produtividade, mesmo com servidores não tão potentes. Utilizamos também para web o ASP.
Mas fora do trabalho estou procurando agora conhecer tanto o ruby quanto o rails para minhas produções pessoais Até logo.
Quantos anos tu tens Akita?
Este cara chega em casa e mergulha numa banheira de formol, ou então, começou a trabalhar aos 5 anos…
Acho que ainda dá pra encarar, pois comecei com Fortran na UFF e depois ALGOL na UFRJ, muito cartão perfurado… Gravar programas em fita cassete no Burroughs deve ser o que é usar o Mac pra vocês hoje em dia.
Mas voltando ao papo sério, valeu mesmo Akita, pois estava procurando algo para experimentar em Ruby, para armazenar algo mais que dados. Trabalho com sistemas que lidam com imagens a alguns anos (FileNet), e esta pode ser uma excelente alternativa para fazer uns testes em casa (por enquanto).
Valeu !
..E eis que conheci o Delphi 1.O e não larguei mais do osso até os dias atuais.
Aos curiosos, não sou tão velho assim: tenho 30 anos. Amigos meus que estudaram na estadual técnica parece que tiveram acesso a Burroughs. Eu sempre quis ter brincado com cartões perfurados, como outros amigos que estudaram 2 gerações antes na USP. Eu comecei no cassete mesmo, no bom e velho MSX Hotbit, na época em que o pessoal estava no TK-90, Sinclair e similares. Na minha época haviam os hobistas de hardware também, que compravam as placas com processador Z-80 para construir em casa. Mas eu nunca fui muito voltado a hardware. O pouco de Assembler que eu brincava vinha da revista Micro Sistemas – alguém lembra disso?
Isso mesmo Eraldo, Delphi 1.0 foi muito bom, eu me lembro de ter brincado com ele pela primeira vez acho que foi em 1995 ou 1996. Mas eu comecei com Turbo Pascal 5, mas pulei rapidamente para 6 porque o único livro que achei na Politécnica foi de Turbo Pascal 6, mas minha versão preferida sempre foi a 7. Foi nela que fiz meus primeiros toolkits gráficos simulando botões e janelas do Windows 3.1 em DOS e também os velhos exercícios de fractais e ambientes em 3D. Aliás, isso foi estranho porque na época eu não sabia usar cálculo de ponto flutuante de precisão, então todo objeto 3D que eu dava zoom e voltava acabava quebrado por causa dos arredondamentos errados de precisão :-)
Com o Delphi 1.0 foi quando comecei a fazer sisteminhas comerciais mesmo. Fui firme no Delphi até o começo da versão 4, mas aí eu desisti dele. Em paralelo eu também brincava de Visual Basic e a versão 6 foi boa o suficiente para abandonar o Delphi. Mas também já era 1998 eu acho e a bolha de internet estava crescendo rápido.
Daí já migrei para ASP 2, PHP 3, Perl 5, Zope/Python tudo de uma vez só, em 3 anos mexi com tudo de uma vez só. Servidores web, bancos de dados, Windows Server, Linux, foi uma correria.
Findo a época da internet, foi quando caí no lado negro do corporativo SAP, onde passei os 5 anos seguintes projetos “Enterprise”. Todo mundo tem que passar por esse “batismo de fogo”. Projetos com dezenas, às vezes centenas de pessoas, coordenar todas as atividades em projetos que duravam meses, às vezes mais de 1 ou 2 anos.
Vida de consultor é complicada, mas a experiência que se ganha num ambiente desses não dá para aprender sozinho. Para entender como uma grande empresa pensa, você precisa passar isso. As piadas do Dilbert passam a fazer muito mais sentido depois disso ;-)
Gostei da sua franqueza. Isso é próprio dos simples de espírito. Pobreza é esse cara aí em cima, que depois de ler tudo, critica expressões repetidas. Ora, vai. Também comecei com Sinclair (montado em casa). Depois percorri pelo CP200, MSX, depois passando para os PCs da vida. Em matéria de linguagem, claro, (pra que mentir?) iniciei pelos Basics. Vi pela primeira vez um DBase II já no MSX. Andei criando alguns sistemas em DbaseII, III, Clipper Summer e até o Clipper 5. Parei porque me aposentei por invalidez (física) e iniciei tratamento internado… Hoje, dedico-me ao saudosismo, que me diverte e ajuda a enfrentar as agrúrias da vida. É apenas um passatempo, claro. Dê-me uma informação: você sabe o nome da Empresa que clonava vergonhosamente o DBse 3 e 4, criando o DIALOG ? Fia muita coisa nele, pois era em português e naquele tempo pouco sabia de inglês. Só as palavras necessárias para Clipper, DBase etc. Tenho curiosidade de me dar de cara novamente com o DIALOG mas não encontro quem disponha de cópias disponíveis. Um abraço e meus sinceros parabéns pela sua dedicação e conhecimento, certamente adquiridos com muito esforço e determinação, bem comum aos orientais.
Não fui mais fundo pq ontem acabei sofrendo um acidente e estou meio que proibido de trabalhar, o que não está funcionando, rsrs
Quanto a idade do MUMPS, como desenvolvo a + de 20 anos com ele, me fez sentir um ancião.
Ainda falando nele podem dar uma pesquisada sobre EWD, bem interessante para quem possui bases legadas em MUMPS e precisa de um front-end web.
Boa noite.