簡體   English   中英

用於數據庫抽象的慣用 haskell

[英]Idiomatic haskell for database abstraction

在 OOP 語言中,我可能會編寫一個數據庫包裝器,它封裝數據庫連接、管理模式並提供一些核心操作,例如execqueryprepare_and_execute 我什至可能有一個單獨的數據庫助手 class 來處理數據庫模式,而數據庫抽象僅用於處理連接。 這將被 model 包裝器/工廠使用,它們使用數據庫抽象 class 創建 model 類的實例。 類似這樣的 UML 圖:

在慣用的 haskell 中設計這樣一個系統的首選方法是什么?

Haskell 中使用最多的數據庫抽象庫是HDBC 這意味着查詢被簡單地表示為帶有占位符的String 很少有人使用HaskellDB ,它提供了一種類型安全的方式來構建查詢。 沒有什么禁止使用用戶數據類型來表示常見查詢和自定義函數來構建它們。

Haskell 中的值是不可變的,這意味着擁有與數據庫中的記錄相對應的可變 object 是沒有用的。 相反,我認為更常見的是定義用戶數據類型和函數,將這些類型的值編組和推入/拉出數據庫。

每當需要更新數據庫時,它們很可能在IO下的一些有狀態 monad 中運行。 例如,這將允許保持連接打開,或者在請求之間做一些事情。

最后,函數首先是 class,因此可以動態構建所有函數。 因此,function 本身可以封裝您想要的任何信息。

所以,我認為,通常的 Haskell 方法包括

  • 表示實際數據的代數數據類型(作為不可變值)
  • 應用程序的 rest 來轉換這些值
  • 生成查詢的函數(封裝模式詳細信息,編組數據到/從 Haskell 數據類型)
  • (可選)運行查詢的有狀態 monad(隱藏數據庫訪問的詳細信息)
  • 運行查詢的函數(隱藏數據庫訪問的詳細信息)

將 Haskell 用於數據庫的最慣用的方式,也是最有效的一種方式,恕我直言,將記錄緩存在 memory 中並在 memory 中使用 STM 事務,以便您使用數據庫進行存儲。 然后,您可以使用事務變量 (TVar´s) 進行記錄管理。 但是您必須定義自己的查詢語言,並且需要一種用於緩存/取消緩存和同步的機制。 這畢竟是 java EJB3 和 Hybernate 所做的。

package TCache 定義 DBRefs,它們是具有 TVar 語義的持久 STM 變量 它們可能是記錄的一部分並指向另一個記錄並且是輕量級的,因此您可以在其上開發自己的抽象。 它還具有類似 SQL 的查詢語言,包括字段搜索、連接和全文搜索。 它在文件中具有默認持久性。 您只需要為您的 Haskell 記錄定義一個鍵,並且您具有文件持久性。 對於數據庫持久性,有一個 IResource class,您可以在其中定義記錄的讀取、寫入和刪除操作。 每條記錄都可能有自己的持久性。 所以所有的數據庫交互都在源代碼的一個位置,memory 中的事務要快幾個數量級。 TCache 每次異步寫入數據庫時都會寫入一致的 state。 它也可以同步寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM