您如何将关系实体表示为BerkeleyDB中可检索数据的单个单元?

时间:2009-06-14 04:34:04

标签: ruby database berkeley-db non-relational-database

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

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

在普通的关系表中,如果要表示Person,则创建一个包含特定数据类型列的表:

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

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

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

将此人分解为单个键/值对(名称=“john”)很容易。

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

为此,您需要强制使用一些人工封装结构来将人员整合在一起。

有办法吗?

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

3 个答案:

答案 0 :(得分:3)

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

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

require 'yaml'; str = person.to_yaml

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

Marshal.dump(person)

仅当人员类别是未引用您不想包含的其他对象的实体时,此方法才有效。例如,需要以不同方式处理对其他人的提及。

答案 1 :(得分:2)

如果您的数据存储区能够这样做(并且BerkeleyDB执行AFAICT),我只会存储用对象Id键入的对象属性的表示,而不会将对象属性拆分为不同的键。

E.g。给出:

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

我将使用键person_1将yaml表示存储在BerkleyDB中:

--- !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";

答案 2 :(得分:1)