2016-04-30 15 views
3

DatomicエンティティのアイデンティティをサービスまたはAPIに公開する方法が混乱しています。DatomicエンティティアイデンティティをサービスまたはREST APIに公開する

は、私はREST APIエンドポイント<id>は、いくつかのブログ記事(ブログ記事エンティティ)を識別し

/api/post/<id> 

があるとします。

リレーショナルデータベースのバックエンドでは、postという名前のテーブルにidという名前の列に格納されている一部のシリアル整数型のものがある可能性があります。

Datomicには同じ意味のテーブル(エンティティ)はなく、そのエンティティIDはデータベース全体で一意ですので、これは通常Datomicでどのように行われるのでしょうか?

  • エンティティ識別子を直接公開する必要がありますか? documentationによれば、エンティティ識別子はデータベース固有のものであるため、これは機能します。しかし、ドキュメンテーションはエンティティ識別子のタイプが何であるかを指定していないので、おそらくそうではありません。 (java.lang.Longの場合は負でもかまいません)
  • UUIDまたはsquuid属性:post/id)を代わりに公開する必要がありますか?同じドキュメンテーションの下では、「エンティティに対してグローバルに一意な識別子を持つことが重要な場合がよくあります。ドメインにそのような識別子が存在しない場合は、値タイプがの一意のID属性db.type/uuid 'を使用できます。それですか?一般に、そのようなエンティティに:post/idのような属性を追加する必要がありますか?

答えて

4

エンドポイントが一時的でない限り、実際にエンティティ番号を公開しないでください(詳細な理由でhereを参照)。このため、ID属性の値を使用するとよいでしょう。この属性は実際にはUUID型である可能性がありますが、文字列や数値も使えます。 Datomicで

、あなたはまた、例えばDatomic lookup refs[:post/id "fdslkjfdskjfsl"]だけではなく"fdslkjfdskjfsl")、「自己完結型」の識別子を使用する機会を持っています。これは、あなたのルートをポストよりも具体的にするのに便利です。 Datomicのスキーマの柔軟性(SQLテーブルやMongoDBコレクションと比較して)と比較して、この利点は特に簡単に達成できます。 URLのルックアップ参照をednエンコードするなど、これを実装できます。

+0

アイデンティティ属性が文字列または整数である場合、(リレーショナルデータベースの '自動インクリメント'機能には何もないので)矛盾することなくどのようにこのような識別子を生成できますか? – glts

+1

このような競合を防ぐには、[トランザクション機能](http://docs.datomic.com/database-functions.html)を使用できます。たとえば、[[:my.funs/generate-id :post/id "hello"] 'は[[:db/add :post/id" hello-3 "]]'に展開されます。この関数は、IDをデータベースにカウンタとともに格納することで実装できます。 –

関連する問題