0

BerkeleyDB是 Ruby 哈希表或 Python 字典的数据库等价物,但您可以为单个键存储多个值。

我的问题是:如果你想在这样的存储结构中存储一个复杂的数据类型,你该怎么做呢?

在一个普通的关系表中,如果你想表示一个人,你可以创建一个包含特定数据类型列的表:

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

当它像这样写出来时,您可以看到如何将一个人理解为一组键/值对:

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

将人员分解为单独的键/值对(name="john")很容易。

但是为了使用 BerkeleyDB 格式来表示 Person,您需要某种方式从其组成键/值对中重新组合 person。

为此,您需要强加一些人为的封装结构来将 Person 作为一个单元组合在一起。

有没有办法做到这一点?

编辑:正如 Robert Harvey 的回答所表明的,BerkeleyDB的Java 版中有一个实体持久性功能。不幸的是,因为我将使用Moneta从一个 Ruby 应用程序连接到 BerkeleyDB ,所以我将使用标准版本,我认为在没有这种支持的情况下,我需要创建一个自定义解决方案。

4

3 回答 3

3

您始终可以将数据序列化(在 Ruby 中称为编组)作为字符串并存储它。序列化可以通过多种方式完成。

使用 YAML(优点:人类可读,不同语言的多种实现):

require 'yaml'; str = person.to_yaml

使用编组(仅限 Ruby,甚至特定于 Ruby 版本):

Marshal.dump(person)

仅当人员类别是不引用您不希望包含的其他对象的实体时,这才有效。例如,对其他人的引用将需要以不同的方式处理。

于 2009-06-14T10:11:11.043 回答
2

如果您的数据存储能够这样做(并且 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

相反,如果您需要将每个属性作为键存储在数据存储中(为什么?),您应该确保人员记录的键在某种程度上与其标识属性相关联,即 ActiveRecord 的 id。

在这种情况下,您会将这些密钥存储在 BerkleyDB 中:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";
于 2009-06-14T10:03:00.487 回答
1

查看注释类型实体的文档:

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

于 2009-06-14T05:09:23.297 回答