2017-05-13 4 views
1

임의의 키 값 쌍을 저장하려고합니다. 단지 datomic 하나 개의 유형을 가질 수임의의 유형의 값 저장

[{:kv/key "foo" 
    :kv/value "bar"} 
{:kv/key "n" 
    :kv/value 12} 
{:kv/key "p" 
    :kv/value 1.2}] 

문제는 :kv/value입니다 : 예를 들어,

{:foo "bar" ; string 
:n 12 ; long 
:p 1.2 ; float 
} 

는 datomic에서, 내가 좋아하는 무언가로 저장하고 싶습니다. 해결책은 :kv/value:kv/value-string, :kv/value-long, :kv/value-float 등으로 분할하는 것입니다. 한 번에 하나의 값 속성 만 사용되도록하는 것과 같은 자체 문제가 있습니다. 제안?

답변

0

구체적인 사용 사례에 대해 자세히 설명해 주면 가장 적합한 대답을 쉽게 파악할 수 있습니다. 이 시점에서 가끔은 문자열, 때로는 int 등이 될 수있는 속성을 갖고 싶은 이유는 약간의 수수께끼입니다.

value-string 등과 같은 다른 속성이 있습니다. 이것은 테이블 DB 열과 같으며 문자열, 정수 등을 저장하는 데 다른 열이 필요합니다.

문제가 표시되면 도구 DB)는 특정 가정으로 설계되었습니다. 이 경우 DB는 각 "열"(Datomic의 특성)이 항상 동일한 유형이라고 가정합니다. 또한 DB는 각 레코드/엔티티에 대해 모든 열/attrs에 데이터를 갖기를 원한다고 가정합니다.

문제가 이러한 가정을 모두 상충하는 것입니다. DB를 사용하여 정보를 저장할 수는 있지만 한 번에 하나의 속성 (값 문자열, 값 int 등) 만 사용되도록 사용자 정의 함수를 작성해야합니다. 아마도 "insert-str-val", "insert-int-val"등과 같은 커스텀 삽입 함수와 "read-str-val"등의 커스텀 읽기 함수가 필요할 것이다. 모든 레코드/엔티티를 허용 할 수있는 밸리데이션 기능을 사용하여 주어진 시간에 정확히 하나의 "유형"만 사용되었다는 것을 확인하는 것도 좋은 생각 일 수 있습니다.

당신은, 그리고 :kv/value함으로써 :kv/key :db.unique/identity 속성을함으로써 이기종 값이있는 키 - 값 저장소를 에뮬레이션 할 수
0

중 하나 바이트 형식의 :db.types/bytes 예 : fressian/살을에는듯한 (또는 문자열 입력하고 원하는 형식의 값을 인코딩 ,에 대한 edn/json). 이 경우 :kv/value:db/indexfalse으로 설정하는 것이 좋습니다.

참고 :

  1. 당신은 값이 인덱싱되지 않습니다으로 제한 쿼리 힘이되며, 각 쿼리에 대한 해제 직렬화해야합니다.
  2. 값 (예 : 데이터 마이그레이션)을 읽거나 쓰는 트랜잭션 함수를 실행하려면 Transactor에서도 인코딩/디코딩 라이브러리를 사용할 수 있도록해야합니다.
  3. 값이 큰 경우 (예 : 20kb 이상) Datomic에 저장하지 마십시오. AWS S3과 같은 보완 스토리지 서비스를 사용하고 URL을 저장하십시오.