7

たとえば、エンティティがいつ作成または更新されたかを知りたいです。:created-atand :update-ator Datomic has theses attributes のような属性をデフォルトで作成する必要がありますか? または、エンティティがいつ作成または更新されたかを調べる方法はありますか?

4

1 に答える 1

16

時間は Datomic の設計の基本です。Datomic の時間の見方の一部は、行がテーブルに挿入され、新しいファクトが行の古いファクトを上書きする従来の CRUD データベースのように、エンティティが作成または更新されないということです。代わりに、エンティティに関する事実は、時間の経過とともに主張および撤回されます。この不変の歴史を考えると、Datomic はどのようにして現在の状態になったかを知っています。ヒストリーデータベースで、時間の経過とともにデータの構造に関する情報を収集できます。

http://docs.datomic.com/clojure/#datomic.api/history

したがって、add-at と updated-at に関する質問に答えるには、Datomic の組み込みの時間認識に頼ることができます。いつ作成されたかを照会するには、2 つのオプションがあります。スキーマに何らかの一意の識別子が含まれている場合は、この属性が作成されたとき (エンティティが最初に追加されたとき) にトランザクションを参照するようにクエリを制限できます。

(d/q '[:find ?e ?tx-time
       :where
       [?e :user/id _ ?tx]
       [?tx :db/txInstant ?tx-time]]
  db)

初期化時に属性に依存できない場合は、次のパラメーター化されたクエリのように、履歴データベースを使用して、エンティティに対応するすべてのトランザクションにかかる時間を最小限に抑えることができます。

(d/q ':find ?e (min ?tx-time)
      :in $ ?e
      :where
      [?e _ _ ?tx _]
      [?tx :db/txInstant ?tx-time]
  (history db) entity-id)

この方法は遅くなりますが、より堅牢になる可能性があることに注意してください。主張されている最新の事実 (「更新」) が必要な場合はmaxmin.

于 2014-07-09T14:09:36.123 に答える