Как бы вы представили реляционную сущность как единую единицу извлекаемых данных в BerkeleyDB? - PullRequest
0 голосов
/ 14 июня 2009

BerkeleyDB является эквивалентом хеш-таблицы Ruby или словаря Python в базе данных, за исключением того, что вы можете хранить несколько значений для одного ключа.

Мой вопрос: если вы хотите сохранить сложный тип данных в такой структуре хранения, как вы можете это сделать?

В обычной реляционной таблице, если вы хотите представить Person, вы создаете таблицу со столбцами определенных типов данных:

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

Когда это написано так, вы можете увидеть, как человека можно понимать как набор пар ключ / значение:

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

Декомпозировать человека на отдельные пары ключ / значение (имя = "Джон") легко.

Но чтобы использовать формат BerkeleyDB для представления личности, вам потребуется какой-то способ перекомпоновки человека из его составных пар ключ / значение.

Для этого вам нужно будет наложить какую-то искусственную инкапсулирующую структуру, чтобы удерживать Человека вместе как единое целое.

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: Как указывает ответ Роберта Харви, в Java редакции BerkeleyDB есть функция сохранения сущностей. К сожалению, поскольку я буду подключаться к BerkeleyDB из приложения Ruby с использованием Moneta , я буду использовать standard edition , который, по моему мнению, требует от меня создания специального решения в отсутствие этой поддержки .

Ответы [ 3 ]

3 голосов
/ 14 июня 2009

Вы всегда можете сериализовать (называемые маршаллингом в Ruby) данные в виде строки и сохранить их вместо этого. Сериализация может быть выполнена несколькими способами.

С YAML (преимущество: удобочитаемость, множественная реализация на разных языках):

require 'yaml'; str = person.to_yaml

С Marshalling (только для Ruby, даже для конкретной версии Ruby):

Marshal.dump(person)

Это будет работать только в том случае, если класс человека - это объект, который не ссылается на другие объекты, которые вы не хотите включать. Например, ссылки на других людей должны были бы заботиться по-другому.

2 голосов
/ 14 июня 2009

Если ваше хранилище данных в состоянии это сделать (а BerkeleyDB делает AFAICT), я бы просто сохранил представление атрибутов объекта, связанных с идентификатором объекта, без разделения атрибутов объекта на разные ключи.

например. Дано:

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

Я бы сохранил представление yaml в BerkleyDB с ключом person_1:

--- !ruby/object:Person 
attributes: 
  id: 1
  name: john
  age: 18
  gender: male

Вместо этого, если вам нужно сохранить каждый атрибут в качестве ключа в хранилище данных (почему?), Вам следует убедиться, что ключ записи о человеке несколько связан с его идентифицирующим атрибутом, это идентификатор ActiveRecord.

В этом случае вы должны хранить эти ключи в BerkleyDB:

person_1_name="john"; 
person_1_age=18; 
person_1_gender="male";
1 голос
/ 14 июня 2009

Посмотрите эту документацию для объекта типа аннотации:

http://www.oracle.com/technology/documentation/berkeley-db/je/java/com/sleepycat/persist/model/Entity.html

...