¿Cómo te representar una entidad relacional como una sola unidad de datos recuperables en BerkeleyDB?
-
13-09-2019 - |
Pregunta
BerkeleyDB es el equivalente a la base de datos de una tabla hash del rubí o un diccionario de Python, salvo que pueda almacenar varios valores para una sola tecla.
Mi pregunta es:? Si quería para almacenar un tipo de datos complejo en una estructura de almacenamiento de este tipo, ¿cómo usted va sobre él
En una tabla relacional normal, si quiere representar a una persona, se crea una tabla con columnas de tipos de datos particulares:
Person
-id:integer
-name:string
-age:integer
-gender:string
Cuando se ha escrito a cabo de esta manera, se puede ver cómo una persona puede ser entendido como un conjunto de pares clave / valor:
id=1
name="john";
age=18;
gender="male";
descomponer la persona en clave individual pares / valor (name = "john") es fácil.
Sin embargo, con el fin de utilizar el formato de datos Berkeley para representar una persona, lo que se necesita alguna forma de recomponer la persona de sus pares clave / valor constituyentes.
Para ello, tendría que imponer alguna estructura de encapsulamiento artificial para mantener a una persona como una unidad.
¿Hay una manera de hacer esto?
EDIT: Como la respuesta de Robert Harvey indica, no es una característica de entidad de persistencia en el Java edición de datos Berkeley. Por desgracia porque voy a connnecting a BerkeleyDB desde una aplicación utilizando Rubí Moneta , seré utilizando la edición estándar que creo que me obliga a crear una solución personalizada en ausencia de este apoyo.
Solución
Siempre se puede serializar (llamado de clasificación en Ruby) los datos como una cadena y la tienda que en su lugar. La serialización se puede hacer de varias maneras.
Con YAML (ventaja: legible por humanos, aplicación múltiple en diferentes idiomas):
require 'yaml'; str = person.to_yaml
Con Marshalling (Rubí-solamente, incluso versión de Ruby específico):
Marshal.dump(person)
Esto sólo funciona si la clase de persona es una entidad que no se refiere a otros objetos que no desee incluir. Por ejemplo, las referencias a otras personas tendrían que ser atendidos de manera diferente.
Otros consejos
Si su almacén de datos es capaz de hacerlo (y lo hace BerkeleyDB AFAICT) que acababa de almacenar una representación de los atributos de los objetos clave con el objeto de identificación, sin dividir el objeto en diferentes atributos claves.
por ejemplo. dado:
Person
-id:1
-name:"john"
-age:18
-gender:"male"
Me almacenar la representación yaml en BerkleyDB con el person_1
clave:
--- !ruby/object:Person
attributes:
id: 1
name: john
age: 18
gender: male
En cambio si es necesario almacenar cada atributo como clave en el almacén de datos (por qué?), Debe asegurarse de que la clave para el documento de persona es algo relacionado con su atributo de identificación, que es la identificación de una ActiveRecord.
En este caso desea almacenar estas teclas en BerkleyDB:
person_1_name="john";
person_1_age=18;
person_1_gender="male";
Tenga una mirada en esta documentación para un tipo de anotación Entidad: