Come si rappresentano un'entità relazionale come una singola unità di dati recuperabili in BerkeleyDB?

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

Domanda

BerkeleyDB è il database equivalente di una tabella hash Ruby o un dizionario Python, tranne che si può memorizzare più valori per un singolo tasto.

La mia domanda è:? Se si voleva conservare un tipo di dati complesso in una struttura di stoccaggio di questo tipo, come puoi andare su di esso

In una tabella relazionale normale, se si vuole rappresentare una persona, si crea una tabella con colonne di particolari tipi di dati:

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

Quando è scritto come questo, si può vedere come una persona potrebbe essere inteso come un insieme di coppie chiave / valore:

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

decomposizione persona in chiave individuale / valore (name = "John") è facile.

Ma al fine di utilizzare il formato BerkeleyDB a rappresentare una persona, si avrebbe bisogno di un modo di ricomporre la persona dalle sue coppie chiave / valore costituenti.

Per questo, si avrebbe bisogno di imporre una certa struttura incapsulante artificiale per tenere una persona insieme come un'unità.

C'è un modo per fare questo?

EDIT: Come risposta di Robert Harvey indica, v'è una caratteristica un'entità persistenza nel Java edizione di BerkeleyDB. Purtroppo, perché sarò connnecting a BerkeleyDB da un'applicazione Rubino utilizzando Moneta , sarò utilizzando l'edizione standard che credo mi obbliga a creare una soluzione personalizzata, in assenza di questo supporto.

È stato utile?

Soluzione

È sempre possibile serializzare (chiamato marshalling in Ruby) i dati come una stringa e negozio che, invece. La serializzazione può essere fatto in diversi modi.

Con YAML (vantaggio: leggibile, implementazione multiple in diverse lingue):

require 'yaml'; str = person.to_yaml

Con Marshalling (Ruby-solo, anche la versione di Ruby specifica):

Marshal.dump(person)

Questo funziona solo se la classe di persona è un'entità che non fa riferimento ad altri oggetti che non desidera includere. Ad esempio, i riferimenti alle altre persone avrebbero bisogno di essere curato in modo diverso.

Altri suggerimenti

Se il datastore è in grado di farlo (e lo fa BerkeleyDB AFAICT) avevo appena memorizzare una rappresentazione degli attributi degli oggetti chiave con l'oggetto Id, senza spaccare l'oggetto attributi in chiavi diverse.

es. data:

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

Mi piacerebbe memorizzare la rappresentazione yaml in BerkleyDB con la person_1 chiave:

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

Se invece avete bisogno di memorizzare ogni attributo come una chiave nella datastore (perché?) È necessario assicurarsi che la chiave per la cronaca persona è in qualche modo legata al suo segno identificativo, che è l'id di un'ActiveRecord.

In questo caso ci si memorizzano questi tasti in BerkleyDB:

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

Date un'occhiata a questa documentazione per un tipo di annotazione entità:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top