【问题标题】:How to think Slick?如何看待 Slick?
【发布时间】:2016-05-21 10:19:56
【问题描述】:

我在使用 Slick 时遇到了一些困难,而且我最近是 Scala/Slick 的采用者。我习惯了 Hibernate 和/或 Rails ActiveRecord,但我在加入大量表格时遇到了一些困难。

我有以下类模式。

case class User(id: UUID, ..., profile: UserProfile)
case class UserProfile(id: UUID, ..., address: Address)
case class Address(id: UUID, ...)

我试图将其作为域模型并让持久层仅获取并加入表以返回域单个对象。

  1. 在 slick 中执行此操作是否正确?
  2. 有没有办法缓存查询结果而不是不断地查询数据库?
  3. Lib 有帮助吗?
  4. 加入例如这 3 个表的最佳方式是什么? 1 通过单独的 DAO 或 Inner Joins 查询他们每个人并使用 Scala 的 groupBy ?

对不起,如果这是一个“新手”问题。我只是想弄清楚如何“Think Slick”。

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:
    1. 没有正确的做法。这取决于您需要对模型执行什么操作...有正确的关系数据库模型建模方法,但您已经知道了。
    2. Slick 不使用任何缓存,请参阅here。但是,如果您使用 Play Framework,它会提供 CacheApi,但我对此没有经验或建议。但是,对于查询,您可以有一些“缓存”,例如 compiled queries
    3. 可能是的,对于简单的案例、简单的表格等。但您也可以使用 Hibernate,它更老、更可靠。
    4. 当我还是一个 Scala/Slick 初学者时,我也被它困住了,所以我写了一个 blog 关于它(它也在 Slick 的 3rd party docs 上,是的,我在吹牛:p)。还有一个简单的配套项目。

    了解简单的 SQL,它的连接等在使用 Slick 时有很大帮助。 例如,外连接(左/右)顺序是否重要,以及其他有趣的问题。

    【讨论】:

    • 我正在努力实现的目标,并且我在我开发的所有应用程序中都这样做,我有一个领域层,我在其中保持我的业务/领域模型不可知,我有由实现的 DAO 或回购接口将与数据库交互的数据访问层
    • 这应该不是问题,您只需将 DAO 注入您的服务(业务/域层)。但这是另一个不太重视 Slick 本身的问题。此外,如果您将 Slick 表分隔在文件中,您可以使用 Scala 的 self-type 从 DAO 注入驱动程序,然后您可以简单地切换(例如从 MySQL 到 H2),就像在这个 PlaySlick example.
    【解决方案2】:

    前段时间我写了一个关于 play + slick 的小教程。检查它,看看它是否有帮助http://pedrorijo.com/blog/play-slick/

    我通常有:

    case class CaseClassA(field1, field2, caseClassB_Id)
    case class CaseClassB(field3, field4)
    

    但也许有更好的方法

    【讨论】:

    • 问题是,我不想在我的域类中有 ID。我正在尝试做休眠样式
    • 是的,但是 Hibernate 是一个 ORM,而“Slick 是 Scala 的现代数据库查询和访问库”。仍然如果有人可以建议一种更好的方法来引用其他域类在一个 slick case 类中,我很高兴知道
    • 好吧好吧。知道了。还有1件事。加入这些表格的最佳方式是什么。多个查询,或加入表和内存组?
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多