伯克利数据库 是相当于 Ruby 哈希表或 Python 字典的数据库,只不过您可以为单个键存储多个值。

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

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

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

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

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

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

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

为此,您需要施加一些人工封装结构来将 Person 作为一个单元保持在一起。

有没有办法做到这一点?

编辑:正如 Robert Harvey 的回答所示,存在实体持久性功能 Java版 伯克利数据库。不幸的是,因为我将使用 Ruby 应用程序连接到 BerkeleyDB 莫内塔, ,我将使用 标准版 我相信这需要我在没有这种支持的情况下创建一个自定义解决方案。

有帮助吗?

解决方案

可以总是序列(称为编组在红宝石)的数据作为一个字符串和商店来代替。串行化可以以几种方式来完成。

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

require 'yaml'; str = person.to_yaml

使用编组(红宝石-只,甚至红宝石版本特定的):

Marshal.dump(person)

这如果类人是不表示您要没有包含其他对象的实体才会工作。例如,向其他人引用将需要不同的照顾。

其他提示

如果您的数据存储是能够做到这一点(和BerkeleyDB的不AFAICT)我只是存储与对象ID键入的对象属性的表示,不分割对象属性在不同的密钥。

E.g。给出:

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

我在BerkleyDB的YAML表示存储与键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";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top