2017-05-13 14 views
1

任意のキー値のペアを保存したいと思います。唯一datomic内の1つのタイプを持つことができます任意のタイプの値を格納する

[{: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などに分割することです。一度に1つの値属性しか使用されないようにするという独自の問題があります。提案?

答えて

0

具体的なユースケースについてさらに詳しく説明できる場合は、最善の答えを見つけ出す方が簡単かもしれません。この時点で、時には文字列、時にはintなどの属性を持つことが必要な理由は、謎のビットです。

これまでの説明から、唯一の本当の答えvalue-stringなどの異なる属性があります。これはSQL DBのようなもので、テーブルの列ごとに1つの型しかなく、文字列、整数などを格納するのに異なる列が必要です。

問題が示すように、 DB)は、一定の前提で設計されています。この場合、DBは各 "列"(Datomicの属性)は常に同じ型であるとみなします。 DBはまた、(通常)各レコード/エンティティのすべての列/ attrsにデータを保持することを前提としています。

問題では、これらの前提条件の両方に矛盾しています。 DBを使用して情報を保存することはできますが、一度に1つの属性(value-string、value-intなど)しか使用しないようにカスタム関数を記述する必要があります。おそらく、 "insert-str-val"、 "insert-int-val"などのカスタム挿入関数、およびカスタム読み取り関数 "read-str-val"などが必要です。レコード/エンティティを受け入れることのできる検証機能を持たせ、特定の時点で正確に1つだけの "タイプ"が使用されていることを確認することも良い考えです。

0

あなたは:db.types/bytes用などfressian /肌寒い(:kv/key:db.unique/identity属性にすることにより、および型指定されたバイト文字列に型指定されたいずれか:kv/valueを作り、あなたが好きなフォーマットで値を符号化することにより、不均一な値を持つキーと値のストアをエミュレートすることができます、edn/json for :db.types/string)。この場合は:kv/valueとして:db/indexfalseに設定することをお勧めします。

注:

  1. 値がインデックス化されず、各クエリのためにデシリアライズする必要がありますようあなたは、限られたクエリの力を持つことになります。
  2. 値を読み書きするトランザクション機能を実行する場合は、エンコード/デコードライブラリをTransactorで使用できるようにする必要があります。
  3. 値が大きい場合(20kbを超える場合など)、それらをDatomicに保存しないでください。 AWS S3のような補完的なストレージサービスを使用し、URLを保存します。
関連する問題