iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

之前在 Day25 討論主鍵的設定有談到:可以視 Datomic 是一種高階資料庫,因為它讓使用者可以不用花心力去思考主鍵如何設計,把心力專注於業務邏輯 (business rule) 之上。

在索引 (index) 這部分,Datomic 也一樣提供了高階的語意。Datomic 有四種索引,其中有三種是全自動產生的。只有一種 AVET 需要在欄位綱要需要使用者去主動設定 :db/index 才會產生。

四種索引分別是:

  1. EAVT
  2. AEVT
  3. AVET
  4. VAET

其中,EAVT 與 AEVT 包含了資料庫裡所有的資料原子 (datom)。AEVT 只包含欄位綱要中有設定 :db/index true 的資料原子。 VAET 只包含欄位綱要的資料型別為 :db.type/ref 的資料原子,VAET 用於反向查詢。

舉個例子,像下方的這個 :order/customer-id 欄位綱要,它就會產生 AVET 索引,而這個索引也是最接近於傳統 SQL 資料庫索引的索引語意。

{:db/ident :order/customer-id
 :db/valueType :db.type/uuid
 :db/index true
 :db/cardinality :db.cardinality/one}

索引的內部

  • EAVT 提供了由資料實體編碼 (entity id) 開始尋找的有效索引,它相當於 SQL 的列式存取 (row access style)。

  • AEVT 提供了屬性 (attr) 開始尋找的有效索引,它相當於 SQL 的行式存取 (column access style)。

  • AVET 這種索引它的維護成本是四種索引中最高的,也因此,它不是預設自動生成的索引。必須要我們特別去設定 :db/index true 才會產生。

  • VAET 這種索引它適用於反向查詢。稍加細想的話,這種索引的對應的值 (V) 都是資料實體編碼,所以自然滿足主鍵的性質:唯一而非空。也因此這種索引也可以自動生成,維護成本不會過高。

其它資源

  1. 歡迎訂閱 PruningSuccess 電子報,主要談論軟體開發、資料處理、資料分析等議題。
  2. 歡迎加入 Clojure 社群

上一篇
條件限制 (constraints)
下一篇
效能改進 -- part 1
系列文
Datomic,內建事件溯源的資料庫。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言