Como você representaria uma entidade relacional como uma unidade única de dados recuperáveis ​​no BerkeleyDB?

StackOverflow https://stackoverflow.com/questions/992173

Pergunta

BerkeleyDB é o equivalente em banco de dados de uma tabela hash Ruby ou de um dicionário Python, exceto que você pode armazenar vários valores para uma única chave.

Minha pergunta é:Se você quisesse armazenar um tipo de dados complexo em uma estrutura de armazenamento como essa, como poderia fazer isso?

Em uma tabela relacional normal, se você quiser representar uma Pessoa, crie uma tabela com colunas de tipos de dados específicos:

Person
-id:integer
-name:string
-age:integer
-gender:string

Quando está escrito assim, você pode ver como uma pessoa pode ser entendida como um conjunto de pares chave/valor:

id=1
name="john"; 
age=18; 
gender="male";

Decompor a pessoa em pares chave/valor individuais (name="john") é fácil.

Mas para usar o formato BerkeleyDB para representar uma Pessoa, você precisaria de alguma forma de recompor a pessoa a partir de seus pares chave/valor constituintes.

Para isso, você precisaria impor alguma estrutura de encapsulamento artificial para manter uma Pessoa unida como uma unidade.

Existe uma maneira de fazer isso?

EDITAR:Como indica a resposta de Robert Harvey, há um recurso de persistência de entidade no Edição Java do BerkeleyDB.Infelizmente, porque estarei me conectando ao BerkeleyDB a partir de um aplicativo Ruby usando Moneta, vou usar o Edição Padrão o que acredito que me obriga a criar uma solução customizada na ausência desse suporte.

Foi útil?

Solução

Você sempre pode serializar (chamado marshalling em Ruby) os dados como uma string e armazená-los.A serialização pode ser feita de diversas maneiras.

Com YAML (vantagem:legível por humanos, implementação múltipla em diferentes idiomas):

require 'yaml'; str = person.to_yaml

Com Marshalling (somente Ruby, até mesmo específico da versão Ruby):

Marshal.dump(person)

Isso só funcionará se a classe person for uma entidade que não se refere a outros objetos que você deseja não incluir.Por exemplo, as referências a outras pessoas precisariam ser tratadas de forma diferente.

Outras dicas

Se o seu armazenamento de dados for capaz de fazer isso (e o BerkeleyDB faz AFAICT), eu apenas armazenaria uma representação dos atributos do objeto codificados com o ID do objeto, sem dividir os atributos do objeto em chaves diferentes.

Por exemplo.dado:

Person
 -id:1
 -name:"john"
 -age:18
 -gender:"male"

Eu armazenaria a representação yaml no BerkleyDB com a chave person_1:

--- !ruby/object:Person 
attributes: 
  id: 1
  name: john
  age: 18
  gender: male

Em vez disso, se você precisar armazenar cada atributo como uma chave no armazenamento de dados (por quê?), certifique-se de que a chave do registro da pessoa esteja de alguma forma vinculada ao seu atributo de identificação, que é o ID de um ActiveRecord.

Neste caso, você armazenaria estas chaves no BerkleyDB:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";

Dê uma olhada nesta documentação para uma entidade de tipo de anotação:

http://www.oracle.com/technology/documentation/berkeley-db/je/java/com/sleepycat/persist/model/Entity.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top