BerkeleyDBの検索可能なデータの単一単位として、リレーショナルエンティティをどのように表現しますか?

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

質問

berkeleydb 単一のキーに複数の値を保存できることを除いて、RubyハッシュテーブルまたはPython辞書に相当するデータベースです。

私の質問は、このようなストレージ構造に複雑なデータタイプを保存したい場合、どのようにそれを進めることができますか?

通常のリレーショナルテーブルでは、人を表現したい場合は、特定のデータ型の列を持つテーブルを作成します。

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

このように書かれている場合、人がキー/バリューのペアのセットとしてどのように理解されるかを見ることができます。

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

人を個々のキー/値のペア(name = "John")に分解するのは簡単です。

しかし、BerkeleyDB形式を使用して人を表すためには、その人をその構成要素のキー/値のペアから再構成する方法が必要です。

そのためには、人をユニットとして一緒に保持するために、人工的なカプセル化構造を課す必要があります。

これを行う方法はありますか?

編集:ロバートハーベイの回答が示すように、エンティティの永続性機能があります Java Edition berkeleydbの。残念ながら、私はRubyアプリケーションを使用してBerkeleydbにconnきるからです モネタ, 、私は使用します 標準版 これは、このサポートがない場合にカスタムソリューションを作成する必要があると思います。

役に立ちましたか?

解決

データを文字列として、代わりにシリアル化(Rubyでマーシャリングと呼ばれる)とすることができます。シリアル化はいくつかの方法で実行できます。

YAML(Advantage:Human Readable、異なる言語での複数の実装):

require 'yaml'; str = person.to_yaml

マーシャリング(Rubyのみ、Rubyバージョン固有):

Marshal.dump(person)

これは、人のクラスが、含まれていない他のオブジェクトを参照しないエンティティである場合にのみ機能します。たとえば、他の人への参照は、別の方法で世話をする必要があります。

他のヒント

DataStoreがそうすることができる場合(およびBerkeleyDBがAFAICTを実行します)、異なるキーにオブジェクト属性を分割することなく、オブジェクトIDにキー付きオブジェクト属性の表現を保存するだけです。

例:与えられた:

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

YAML表現をBerkleyDBにキーと一緒に保存します person_1:

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

代わりに、各属性をデータストアのキーとして保存する必要がある場合(なぜ?)、その人レコードのキーがその識別属性に多少リンクされていることを確認する必要があります。これがActiverCordのIDです。

この場合、これらのキーをBerkleyDBに保存します。

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

注釈タイプのエンティティについては、このドキュメントをご覧ください。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top