Как бы вы представили реляционную сущность как единую единицу извлекаемых данных в BerkeleyDB?
-
13-09-2019 - |
Вопрос
БерклиДБ является эквивалентом базы данных хеш-таблицы 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";
Взгляните на эту документацию для объекта типа аннотации: