http://www.yesodweb.com/book/persistent 中没有提到 SQL View 。

我(即使在命令式语言中)一直非常喜欢不可变数据库模式设计。即只有 INSERT 和 SELECT - 不使用 UPDATE 和 DELETE。

这具有保留所有历史的优点,代价是使当前“状态”成为数据库中相对昂贵的历史纯函数。

例如没有'user'表,只有'user_created'、'user_password_updated'和'user_deleted'表,它们统一在'user'SQL VIEW中,显示用户的当前状态。

我应该如何在 Persistent 中使用 VIEW?我应该完全使用 Persistent - 它(对 Haskell 来说具有讽刺意味)是否过于专注于我的用例的可变数据库?

最佳答案

这个问题被问了很长时间了,但我认为这是值得的
回应因为七年后答案没有改变,我真的很喜欢
您关于保留旧版本表格并阅读它们的想法
意见!这种方法的一个缺点是在 persistent 中使用 Template Haskell
会大大减慢编译时间。一旦我有一个大约有 50 个表的数据库persistent 模板 Haskell 编译花了半个多小时
曾经改变。

Yesod的persistent不支持
SQL View ,我怀疑它永远不会,因为它打算与数据库无关。
目前看起来它支持 CouchDB、MongoDB、MySQL、PostgreSQL、Redis
和 SQLite。并非所有这些数据库都支持 SQL 样式 View ,因此
很难抽象所有这些。
persistent 擅长的地方在于提供一种简单的方法来创建一组
序列化为和的 Haskell 类型
来自不同的数据库。它提供了类型类实例和函数来
做单表查询,这些工作非常好。如果要对 SQL 数据库执行联接查询,
您正在与 persistent 交互,然后您可以使用 esqueleto
用于 SQL 连接查询的类型安全 EDSL。

至于在 Haskell 中处理 SQL View ,我还没有遇到任何工具。
您可以使用 rawQuery ,它可以工作但更难维护或
您可以围绕 Haskell DB 接口(interface)(如 postgresql-simple )构建自己的工具,
这就是 persistent 所做的。事实上,你甚至可以从 persistent 开始
您正在使用的任何数据库的源代码并根据您的需要构建 SQL View EDSL
需要。在一个闭源项目中,我帮助构建了一个自定义的 PostgreSQL
基于 persistent 的一些想法和类型的接口(interface),但没有使用
一个 Template Haskell,因为编译时间太慢了。

10-08 12:45