Comment voulez-vous représenter une entité relationnelle comme une seule unité de données dans BerkeleyDB récupérables?

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

Question

BerkeleyDB est la base de données équivalent d'un Hashtable Ruby ou un dictionnaire Python, sauf que vous pouvez stocker plusieurs valeurs pour une seule clé.

Ma question est: Si vous voulez stocker un type de données complexe dans une structure de stockage comme celui-ci, comment pourriez-vous parler

Dans une table relationnelle normale, si vous souhaitez représenter une personne, vous créez une table avec des colonnes de types particuliers de données:

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

Quand il est écrit comme ça, vous pouvez voir comment une personne peut être comprise comme un ensemble de paires clé / valeur:

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

Décomposer la personne en clé individuelle / paires de valeurs (name = "john") est facile.

Mais pour utiliser le format BerkeleyDB pour représenter une personne, vous auriez besoin d'une certaine façon de recomposer la personne de ses paires clé constituant / valeur.

Pour cela, vous devez imposer une structure d'encapsulage artificielle pour tenir une personne ensemble comme une unité.

Est-il possible de le faire?

EDIT: Comme la réponse de Robert Harvey indique, il est une caractéristique de persistance de l'entité dans le Edition Java de BerkeleyDB. Malheureusement, parce que je vais connnecting à BerkeleyDB d'une application Ruby en utilisant Moneta , je serai en utilisant le édition standard que je crois me oblige à créer une solution personnalisée en l'absence de ce soutien.

Était-ce utile?

La solution

Vous pouvez toujours sérialisation (appelé Ruby marshalling) les données sous forme de chaîne et de stocker qu'au lieu. La sérialisation peut se faire de plusieurs façons.

Avec YAML (avantage: lisible par l'homme, la mise en œuvre multiple dans différentes langues):

require 'yaml'; str = person.to_yaml

Avec la sérialisation (Ruby seule, même la version Ruby spécifique):

Marshal.dump(person)

Cela ne fonctionnera que si une catégorie de personnes est une entité qui ne fait pas référence à d'autres objets que vous souhaitez pas inclus. Par exemple, les références à d'autres personnes devraient être pris en charge différemment des.

Autres conseils

Si votre datastore est en mesure de le faire (et ne BerkeleyDB AFAICT) Je venais de stocker une représentation des attributs d'objet calées avec l'objet Id, sans diviser l'objet d'attributs dans les clés différentes.

par exemple. donné:

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

Je stocker la représentation YAML dans BerkleyDB avec la person_1 clé:

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

Au lieu de cela si vous avez besoin de stocker chaque attribut comme une clé dans le datastore (pourquoi?), Vous devez vous assurer que la clé pour l'enregistrement de la personne est un peu lié à son attribut d'identification, qui est l'identification d'une ActiveRecord.

Dans ce cas, vous souhaitez stocker ces clés dans BerkleyDB:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top