5

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

我(甚至在命令式语言中)一直非常喜欢不可变的数据库模式设计。即只有 INSERTs 和 SELECTs - 不使用 UPDATEs 和 DELETEs。

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

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

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

4

1 回答 1

1

自从提出这个问题以来已经有很长时间了,但我认为值得回应,因为七年后答案没有改变,我真的很喜欢你关于保留旧版本的表格并通过视图阅读它们的想法!这种方法的一个缺点是使用 Template Haskellpersistent 会大大减慢编译时间。有一次,我在 Template Haskell 中有一个包含大约 50 个表的数据库, persistent如果它被更改,编译需要半个多小时。

Yesod 的持久化不支持 SQL 视图,我怀疑它永远不会支持,因为它打算与数据库无关。目前它看起来支持 CouchDB、MongoDB、MySQL、PostgreSQL、Redis 和 SQLite。并非所有这些数据库都支持 SQL 样式视图,因此很难对所有这些数据库进行抽象。

persistent擅长的地方在于提供一种简单的方法来创建一组在不同数据库之间进行序列化的 Haskell 类型。它提供了类型类实例和函数来进行单表查询,并且这些工作非常好。如果您想在您正在与之交互的 SQL 数据库上执行连接查询persistent,那么您可以使用esqueleto,这是一种用于 SQL 连接查询的类型安全的 EDSL。

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

于 2019-11-20T14:05:45.963 回答