BerkeleyDB에서 단일 검색 가능한 데이터 단위로 관계형 엔티티를 어떻게 대표 하시겠습니까?

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

문제

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";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top