验证Datomic实体ID是否有效

问题描述:

如何验证Datomic实体ID是否有效?验证Datomic实体ID是否有效

我正在使用Scala和Datomisca,但任何测试都应该可能也适用于Clojure和Datomic。

我的假设是一个有效的实体将拥有至少一个属性使用

connection.database.entity(id).toMap.nonEmpty 

考虑。

有没有更好,更安全的方法来做到这一点?

根据所Datomic文档this section

实体是不适合于存在测试,这应典型地经由一个唯一的标识的查询被执行。

可能是更好的使用是这样的(Clojure中):如果没有相关的ID属性

(d/q '[:find ?a 
     :in $ ?entid 
     :where [?entid ?a]] 
    db 
    id) 

这将返回一个空集。你可以创建一个抽象此查询谓词功能:

(defn valid-id? [db id] 
    ((comp not empty?) (d/q '[:find ?a 
          :in $ ?entid 
          :where [?entid ?a]] 
          db 
          id))) 

我是用Clojure写的例子很抱歉,但我不知道Datomisca。

+1

其他评论(从团队合并) - 你不应该结束手中的实体ID你不确定的状态。造成这种情况的原因是: (1)实体对于面向外部的ID不理想--UUID,电子邮件等更好。请参阅:http://docs.datomic.com/identity.html (2)实体ID不保证跨数据库保留。目前,这是一个实施细节,不属于合同的一部分,数据库在备份/恢复时保留实体ID。如果你必须重放一个数据库的日志到另一个数据库,分片时它们将不会被保留。 – 2015-02-09 15:11:45

+0

我们的应用程序不存储实体ID在外部位置,但我们确实从REST调用返回它们。然后,浏览器可以在随后的调用中包含ID,嵌入到URL中。我正在寻找一种方法来验证嵌入式ID是否有效,并且未被浏览器JavaScript代码错误地更改(“trust,but verify”)。 – Ralph 2015-11-12 13:54:22