BerkeleyDB에서 단일 검색 가능한 데이터 단위로 관계형 엔티티를 어떻게 대표 하시겠습니까?
-
13-09-2019 - |
문제
Berkeleydb 데이터베이스는 단일 키에 대한 여러 값을 저장할 수있는 경우를 제외하고 Ruby Hashtable 또는 Python 사전과 동일합니다.
내 질문은 : 이와 같은 스토리지 구조에 복잡한 데이터 유형을 저장하고 싶다면 어떻게 할 수 있습니까?
일반적인 관계형 테이블에서 사람을 대표하려면 특정 데이터 유형의 열이있는 테이블을 만듭니다.
Person
-id:integer
-name:string
-age:integer
-gender:string
이와 같이 기록되면 사람이 어떻게 키/값 쌍의 세트로 이해 될 수 있는지 알 수 있습니다.
id=1
name="john";
age=18;
gender="male";
개인을 개별 키/값 쌍으로 분해하는 것은 쉽습니다.
그러나 BerkeleyDB 형식을 사용하여 사람을 나타내려면 구성 요소 키/값 쌍에서 사람을 재구성하는 방법이 필요합니다.
이를 위해서는 사람을 한 단위로 유지하기 위해 인공 캡슐화 구조를 부과해야합니다.
이것을 할 방법이 있습니까?
편집 : Robert Harvey의 답변에서 알 수 있듯이 엔티티 지속성 기능이 있습니다. 자바 에디션 Berkeleydb의. 불행히도 나는 루비 애플리케이션에서 BerkeleyDB에 연결되기 때문에 모네타, 나는 그것을 사용할 것이다 표준 판 이 지원이 없을 때 사용자 정의 솔루션을 만들어야한다고 생각합니다.
해결책
당신은 항상 문자열로 데이터를 직렬화 (Ruby에서 마샬링) 할 수 있으며 대신 저장할 수 있습니다. 직렬화는 여러 가지 방법으로 수행 할 수 있습니다.
Yaml (Advantage : Human Readable, 다른 언어로 된 다중 구현) : :
require 'yaml'; str = person.to_yaml
마샬링 (루비 전용, 심지어 루비 버전) :
Marshal.dump(person)
이것은 사람의 클래스가 포함하지 않으려는 다른 개체를 언급하지 않는 실체 인 경우에만 작동합니다. 예를 들어, 다른 사람에 대한 언급은 다르게 돌봐야합니다.
다른 팁
DataStore가 그렇게 할 수 있고 BerkeleyDB가 AFAICT를 수행 할 수 있다면 객체 속성을 다른 키로 분할하지 않고 객체 ID와 키어 된 개체 속성의 표현을 저장합니다.
예 : 주어진 :
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의 ID입니다.
이 경우 이러한 키를 BerkleydB에 저장합니다.
person_1_name="john";
person_1_age=18;
person_1_gender="male";
주석 유형 엔티티에 대한이 문서를 살펴보십시오.