用于数据库抽象的习语Haskell

在OOP语言中,我可能会编写一个封装数据库连接,管理模式并提供少量核心操作(如execqueryprepare_and_execute的数据库封装器。 我甚至可能会有一个单独的数据库帮助程序类来处理数据库模式,只留下数据库抽象来处理连接。 这将被模型包装器/工厂使用,它们使用数据库抽象类来创建模型类的实例。 像这个UML图一样的东西:

在惯用的haskell中设计这样一个系统的首选方式是什么?


Haskell中最常用的数据库抽象库是HDBC。 这意味着查询只是用占位符表示为String 。 很少有人使用HaskellDB,它提供了一种类型安全的方式来构建查询。 没有任何东西可以禁止用户数据类型来表示常见查询和自定义函数来构建它们。

Haskell中的值是不可变的,这意味着在数据库中有一个对应于记录的可变对象是没有用的。 相反,我认为定义用户数据类型和函数会更常见,这些数据类型和函数会将这些类型的值集中到/从数据库中进行推送/拉出。

无论何时需要更新数据库,它们都可能在IO下运行在某个有状态monad中。 这将允许保持连接打开,或者在请求之间做一些事情。

最后,函数是第一类的,所以可以实时构建所有函数。 所以一个函数本身可以封装你想要的任何信息。

所以,我认为,通常的Haskell方法由...组成

  • 用于表示实际数据的代数数据类型(作为不可变值)
  • 其余的应用程序来转换这些值
  • 生成查询的函数(封装模式细节,将数据封送到Haskell数据类型或从Haskell数据类型封送数据)
  • (可选)有状态monad来运行查询(隐藏数据库访问的详细信息)
  • 运行查询的函数(隐藏数据库访问的详细信息)

  • 将Haskell用于数据库的最惯用的方式是,最有效的方法是将内存中的记录缓存,并在内存事务中使用STM,以便使用数据库进行存储。 然后,您可以使用事务变量(TVar's)进行记录管理。 但是你必须定义你自己的查询语言,并且你需要一个缓存/取消缓存和同步的机制。 毕竟这是Java EJB3和Hybernate所做的。

    TCache包定义了DBRefs,它们是具有TVar语义的持久性STM变量。 它们可能是记录的一部分,并指向另一条记录并且是轻量级的,所以您可以开发自己的抽象。 它还具有SQL查询语言,包括字段搜索,连接和全文搜索。 它在文件中具有默认持久性。 你只需要为你的Haskell记录定义一个键,并且你有文件持久性。 对于数据库持久性,有一个IResource类,您可以在其中为记录定义读取,写入和删除操作。 每个记录可能有其自己的持久性。 因此,所有数据库交互都位于源代码的单个位置,并且内存中的事务处理速度要快几个数量级。 每次在数据库中异步写入时,TCache都会写入一致的状态。 它也可以同步写入。

    链接地址: http://www.djcxy.com/p/52263.html

    上一篇: Idiomatic haskell for database abstraction

    下一篇: Getting number of rows inserted on IBM DB2 V6R1 (AS400) through JBDC