在 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,因为编译时间太慢了。