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,我相信在没有这种支持的情况下我需要我创建一个自定义解决方案。答案 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)