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
のような属性を追加する必要がありますか?
アイデンティティ属性が文字列または整数である場合、(リレーショナルデータベースの '自動インクリメント'機能には何もないので)矛盾することなくどのようにこのような識別子を生成できますか? – glts
このような競合を防ぐには、[トランザクション機能](http://docs.datomic.com/database-functions.html)を使用できます。たとえば、[[:my.funs/generate-id:post/id "hello"] 'は[[:db/add :post/id" hello-3 "]]'に展開されます。この関数は、IDをデータベースにカウンタとともに格納することで実装できます。 –