O Zodb armazena objetos Python usando uma versão estendida da persistência de objeto interno do Python (Pickle). Um banco de dados ZODB possui um único objeto root (normalmente um dicionário), que é o único objeto diretamente acessível pelo banco de dados. Todos os outros objetos armazenados no banco de dados são alcançados através do objeto raiz. Os objetos referenciados por um objeto armazenados no banco de dados também são armazenados automaticamente no banco de dados.
O ZODB suporta transações simultâneas usando o MVCC e rastreia alterações nos objetos por objeto. Apenas objetos alterados são comprometidos. As transações não são destrutivas por padrão e podem ser revertidas.
Por exemplo, digamos que tenhamos um carro descrito usando 3 aulas de carro, roda e parafuso. Em Python, isso pode ser representado da seguinte maneira:
Se a variável mycar for a raiz da persistência, então:
Isso coloca todas as instâncias do objeto (carro, roda, parafusos etc.) em armazenamento, que podem ser recuperadas posteriormente. Se outro programa recebe uma conexão com o banco de dados através do objeto MyCar, executando:
E recupera todos os objetos, o ponteiro para o carro que está sendo mantido na variável do carro. Então, em algum estágio posterior, esse objeto pode ser alterado com um código Python como:
O armazenamento é alterado para refletir a mudança de dados (após a ordem de uma confirmação).
Não há declaração da estrutura de dados em Python ou Zodb, para que novos campos possam ser adicionados livremente a qualquer objeto existente.
Para que a persistência ocorra, a aula de carro Python deve ser derivada da persistência. Classe persistente - Esta classe mantém os dados necessários para que a maquinaria de persistência funcione, como o ID do objeto interno, o estado do objeto e assim por diante, mas também define o limite da persistência no seguinte sentido: todo objeto cuja classe Deriva de persistente é a unidade atômica de armazenamento (todo o objeto é copiado para o armazenamento quando um campo é modificado).
No exemplo acima, se o carro é a única classe derivada de persistente, quando o Wheel3 é adicionado ao carro, todos os objetos devem ser gravados no armazenamento. Por outro lado, se a roda também deriva de persistente, então quando carzz.wheel3 = roda é executada, um novo registro é escrito no armazenamento para manter o novo valor do carro, mas a roda existente é mantida e o novo registro para o O carro aponta para o registro de roda já existente dentro do armazenamento.
A maquinaria ZODB não persegue a modificação através do gráfico de ponteiros. No exemplo acima, carzz.wheel3 = algo é uma modificação rastreada automaticamente pela maquinaria Zodb, porque o Carzz é do carro (persistente). A maquinaria Zodb faz isso marcando o registro como sujo. No entanto, se houver uma lista, qualquer alteração dentro da lista não será notada pelas máquinas do Zodb, e o programador deve ajudar adicionando manualmente carzz._p_changed = 1, notificando o Zodb que o registro realmente mudou. Assim, até certo ponto, o programador deve estar ciente do funcionamento das máquinas de persistência.
A unidade de armazenamento (ou seja, um objeto cuja classe deriva de persistente) também é a unidade de atomicidade. No exemplo acima, se os carros são a única classe persistente, um encadeamento modifica uma roda (o registro do carro deve ser notificado) e outro encadeamento modifica outra roda dentro de outra transação, a segunda confirmação falhará. Se a roda também for persistente, ambas as rodas podem ser modificadas de forma independente por dois roscas diferentes em duas transações diferentes.
A persistência da classe - escrevendo a classe de um objeto específico no armazenamento - é obtido escrevendo um tipo de nome "totalmente qualificado" da classe em cada registro no disco. No Python, o nome da classe envolve a hierarquia do diretório que o arquivo de origem da classe reside. Uma conseqüência é que o arquivo de origem do objeto persistente não pode ser movido. Se for, a maquinaria ZODB não consegue localizar a classe de um objeto ao recuperá -lo do armazenamento, resultando em um objeto quebrado.
O Zope Enterprise Objects (ZEO) é uma implementação de armazenamento do ZODB que permite que vários processos do cliente persistam objetos em um único servidor Zeo. Isso permite escala transparente.