Как бы вы представили реляционную сущность как единую единицу извлекаемых данных в BerkeleyDB?

StackOverflow https://stackoverflow.com/questions/992173

Вопрос

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

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

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

require 'yaml'; str = person.to_yaml

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

Marshal.dump(person)

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

Другие советы

Если ваше хранилище данных может это сделать (а 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";

Взгляните на эту документацию для объекта типа аннотации:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top