2015-02-05 84 views
1

如何驗證Datomic實體ID是否有效?驗證Datomic實體ID是否有效

我正在使用Scala和Datomisca,但任何測試都應該可能也適用於Clojure和Datomic。

我的假設是一個有效的實體將擁有至少一個屬性使用

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

考慮。

有沒有更好,更安全的方法來做到這一點?

回答

2

根據所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