Wie würden Sie eine relationale Einheit als einzelne Einheit abrufbarer Daten in Berkeleydb darstellen?

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

Frage

Berkeleydb Ist das Datenbankäquivalent eines Ruby -Hashtabels oder eines Python -Wörterbuchs, außer dass Sie mehrere Werte für einen einzelnen Schlüssel speichern können.

Meine Frage lautet: Wenn Sie einen komplexen Datentyp in einer solchen Speicherstruktur speichern möchten, wie können Sie ihn dann vorgehen?

Wenn Sie in einer normalen relationalen Tabelle eine Person darstellen möchten, erstellen Sie eine Tabelle mit Spalten bestimmter Datentypen:

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

Wenn es so ausgeschrieben ist, können Sie sehen, wie eine Person als eine Reihe von Schlüssel-/Wertpaaren verstanden werden kann:

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

Das Zerlegen der Person in einzelne Schlüssel-/Wertpaare (name = "John) ist einfach.

Um das Berkeleydb -Format zu verwenden, um eine Person darzustellen, benötigen Sie eine Möglichkeit, die Person aus ihren Taste/Wert -Paaren des Bestandteils neu zu verdichten.

Dafür müssten Sie eine künstliche Einkapselungsstruktur auferlegen, um eine Person als Einheit zusammenzuhalten.

Gibt es eine Möglichkeit, dies zu tun?

Bearbeiten: Wie die Antwort von Robert Harvey angibt, gibt es eine Entitätsdauerfunktion in der Java Edition von Berkeleydb. Leider, weil ich aus einer Ruby -Anwendung mit Berkeleydb mithilfe von Ruby -Anwendung zusammenhängt Moneta, Ich werde das verwenden Standard Edition Ich glaube, ich erfordert, dass ich ohne diese Unterstützung eine benutzerdefinierte Lösung erstellen muss.

War es hilfreich?

Lösung

Sie können die Daten immer als Zeichenfolge serialisieren (Marshalle in Ruby) und stattdessen speichern. Die Serialisierung kann auf verschiedene Weise durchgeführt werden.

Mit YAML (Vorteil: Menschen lesbar, multiple Implementierung in verschiedenen Sprachen):

require 'yaml'; str = person.to_yaml

Mit Marshalling (nur Ruby, sogar Ruby-Version spezifisch):

Marshal.dump(person)

Dies funktioniert nur, wenn die Klasse von Person eine Entität ist, die sich nicht auf andere Objekte bezieht, die Sie nicht enthalten möchten. Beispielsweise müssten Verweise auf andere Personen unterschiedlich betreut werden.

Andere Tipps

Wenn Ihr Datenspeicher dies in der Lage ist (und Berkeleydb), würde ich nur eine Darstellung der mit der Objekt -ID geküssten Objektattribute speichern, ohne die Objektattribute in verschiedenen Schlüssel zu teilen.

ZB gegeben:

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

Ich würde die YAML -Darstellung in Berkleydb mit dem Schlüssel aufbewahren person_1:

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

Wenn Sie jedes Attribut als Schlüssel im Datenspeicher speichern müssen (warum?), Sie sollten sicherstellen, dass der Schlüssel für den Person -Datensatz etwas mit seinem identifizierenden Attribut verknüpft ist. Dies ist die ID für einen Activerecord.

In diesem Fall würden Sie diese Schlüssel in Berkleydb aufbewahren:

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

Schauen Sie sich diese Dokumentation für eine Entität von Annotationstyp an:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top