Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在BerkeleyDB中,如何将关系实体表示为单个可检索数据单元?_Ruby_Database_Berkeley Db_Non Relational Database - Fatal编程技术网

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

Ruby 在BerkeleyDB中,如何将关系实体表示为单个可检索数据单元?,ruby,database,berkeley-db,non-relational-database,Ruby,Database,Berkeley Db,Non Relational Database,是与Ruby哈希表或Python字典等效的数据库,只是可以为单个键存储多个值 我的问题是:如果您想在这样的存储结构中存储一个复杂的数据类型,您该怎么做呢? 在普通关系表中,如果要表示一个人,可以创建一个包含特定数据类型列的表: Person -id:integer -name:string -age:integer -gender:string 当这样写出来时,您可以看到如何将一个人理解为一组键/值对: id=1 name="john"; age=18; gender="male"; 将

是与Ruby哈希表或Python字典等效的数据库,只是可以为单个键存储多个值

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

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

Person
-id:integer
-name:string
-age:integer
-gender:string
当这样写出来时,您可以看到如何将一个人理解为一组键/值对:

id=1
name="john"; 
age=18; 
gender="male";
将人员分解为单独的键/值对(name=“john”)很容易。

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

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

有没有办法做到这一点?


编辑:正如罗伯特·哈维(Robert Harvey)的回答所指出的,在伯克利DB的应用程序中有一个实体持久性特性。不幸的是,因为我将使用从Ruby应用程序连接到BerkeleyDB,所以我将使用,我相信这需要我在没有此支持的情况下创建自定义解决方案。

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


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


如果您的数据存储能够做到这一点(BerkeleyDB做了AFAICT),那么我只需要存储一个对象属性的表示,该对象属性用对象Id键控,而不需要在不同的键中拆分对象属性

例如:

Person
 -id:1
 -name:"john"
 -age:18
 -gender:"male"
我会使用键
person\u 1
将yaml表示存储在BerkleyDB中:

--- !ruby/object:Person 
attributes: 
  id: 1
  name: john
  age: 18
  gender: male
相反,如果需要将每个属性作为键存储在数据存储中(为什么?),则应确保person记录的键与其标识属性(即ActiveRecord的id)有一定的链接

在本例中,您将在BerkleyDB中存储这些密钥:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";

如果您的数据存储能够做到这一点(BerkeleyDB做了AFAICT),那么我只需要存储一个对象属性的表示形式,并使用对象Id设置键,而不需要将对象属性拆分为不同的键

例如:

Person
 -id:1
 -name:"john"
 -age:18
 -gender:"male"
我会使用键
person\u 1
将yaml表示存储在BerkleyDB中:

--- !ruby/object:Person 
attributes: 
  id: 1
  name: john
  age: 18
  gender: male
相反,如果需要将每个属性作为键存储在数据存储中(为什么?),则应确保person记录的键与其标识属性(即ActiveRecord的id)有一定的链接

在本例中,您将在BerkleyDB中存储这些密钥:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";
您始终可以将数据序列化(在Ruby中称为封送)为字符串,并将其存储。序列化可以通过几种方式完成

使用YAML(优点:可读性强,多种语言实现):

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

只有当person类是一个实体,而该实体并没有引用您不希望包含的其他对象时,这才起作用。例如,对其他人的提及需要以不同的方式处理

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

使用YAML(优点:可读性强,多种语言实现):

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


只有当person类是一个实体,而该实体并没有引用您不希望包含的其他对象时,这才起作用。例如,对其他人的提及需要以不同的方式处理

非常好的链接,谢谢。几乎正是我想要的。不幸的是,这个特性在Java版中可用,但在我将在Ruby中使用的标准版中不可用:非常好的链接,谢谢。几乎正是我想要的。不幸的是,这个特性在Java版中是可用的,但在我将在Ruby中使用的标准版中是不可用的:这接近于正确的策略。小心处理“有”其他对象的对象。您确实希望在大多数情况下存储对其他对象的引用。我在谷歌上搜索了一下,发现Ruby似乎没有真正的对象数据库,这太糟糕了。看一看Perl的KiokuDB或CL的Elephant,了解如何正确处理这类事情。如果BerkleyDB不是一个严格的要求,我也会看看Redis:因为它为开发人员提供了更丰富的数据结构词汇表(列表、集合),具有定义良好的计算复杂性(例如,您知道不同操作的大O复杂性),这接近于正确的策略。小心处理“有”其他对象的对象。您确实希望在大多数情况下存储对其他对象的引用。我在谷歌上搜索了一下,发现Ruby似乎没有真正的对象数据库,这太糟糕了。看一看Perl的KiokuDB或CL的Elephant,了解如何正确处理这类事情。如果BerkleyDB不是一个严格的要求,我也会考虑Redis:因为它为开发人员提供了更丰富的数据结构词汇表(列表、集合),具有定义良好的计算复杂性(例如,您知道不同操作的大O复杂性)