验证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。
其他评论(从团队合并) - 你不应该结束手中的实体ID你不确定的状态。造成这种情况的原因是: (1)实体对于面向外部的ID不理想--UUID,电子邮件等更好。请参阅:http://docs.datomic.com/identity.html (2)实体ID不保证跨数据库保留。目前,这是一个实施细节,不属于合同的一部分,数据库在备份/恢复时保留实体ID。如果你必须重放一个数据库的日志到另一个数据库,分片时它们将不会被保留。 – 2015-02-09 15:11:45
我们的应用程序不存储实体ID在外部位置,但我们确实从REST调用返回它们。然后,浏览器可以在随后的调用中包含ID,嵌入到URL中。我正在寻找一种方法来验证嵌入式ID是否有效,并且未被浏览器JavaScript代码错误地更改(“trust,but verify”)。 – Ralph 2015-11-12 13:54:22