在 BerkeleyDB 中,如何将关系实体表示为可检索数据的单个单元?
-
13-09-2019 - |
题
伯克利数据库 是相当于 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";