我认为这个问题没有唯一的正确答案...但我建议您考虑以下因素...您决定使用关系数据库(我认为这完全没问题!)...因此,有人可能会说...首先和最重要的是,您的问题与ER建模等有关...而不仅仅是关于Clojure... :-)...
...我的意思是什么...嗯...您已经提到了ORM...由于Java中关系世界和OO世界之间的“阻抗/范式不匹配”,很多时候,这会导致大量的混乱/头痛...等等。
好吧...但是您付出了巨大的代价(我认为)通过采用ORM...也就是说,如果您不慎重,例如Hibernate将提出最疯狂的事物/查询...例如,当天真地获取某种树结构时,生成的SQL可能相当愚蠢...显然Hibernate非常强大...您可以集成非常复杂的缓存等...等等...但是要正确/有效地使用Hibernate并不那么容易/简单...我认为...
所以,即使是在做Java的时候,我也建议首先考虑Spring JDBC数据访问,因为……正如我说的那样……JPA无疑增加了许多复杂性……(因此要问问自己你真的需要JPA吗……)
……不管怎样,我想说的是,关系型数据库很棒……SQL很棒……PostgreSQL很棒!!!许多编程语言的麻烦在于,与关系型技术交互往往非常痛苦,所以你开始构建各种工具,如ORM等,以使生活更加可忍受。(……所以我们在谈论一种治疗,而不是一种治愈……)
……现在我想论证,用Clojure的话来说,整个不匹配问题要小得多,因为Clojure并不是围绕像Person等类构建的,而是你有几个强大的集合,你就可以开业了 :-)……
……所以让我们来具体一点……我已经用Clojure(script)构建了这个闪卡SAP应用程序。
……现在,我对许多事情都感到不太满意……例如,我真的想从Bootstrap转到bulma等类似的东西。这是我做的第一个不太大的Clojure项目……所以显然我犯了很多错误,我将尽可能地尝试重构/改进东西。然而,主要的一点是,我最不担心的是PostgreSQL/RDBMS部分。
……我用luminus模板设置PostgreSQL项目……该设置包括hugsql(一个拥抱SQL的Clojure库)……然后你可以做你的DDL/架构 stuff……你的PostgreSQL查询……存储过程等等。等等。以一种完全独立于任何应用程序编程语言的方式……只需使用你的PostgreSQL工具/知识即可……多么伟大啊!!!……例如,如果你想从Clojure切换到Java/Node等等,好,你的整个数据库/持久层东西基本上可以保持原样……因为使用hugsql,你实际上只是在做SQL……再加上非常少的元配置东西,你可以在注释中放进去……从这些注释中,你会得到可以使用来运行查询的Clojure函数。你可以将这些预处理语句的参数作为map传递,并得到单个记录的map输出,或n记录的map序列,如果没有记录则输出nil。我想。
……在执行变换等操作时,你拥有所有基本但强大的Clojure函数,它们使调整map和seq变得轻而易举。此外,总是会有一些类型转换的东西,当你从PostgreSQL到Java,从Java到JS转换时。但是,如果你使用luminus,你将获得这些内置助手。例如,在我的闪卡应用中,有很多时间戳(……你在什么时候回答了一张卡是对的,你在什么时候留下了评论等等……)。而日期类型一直很棘手……java.sql、java.util、joda等……但是当我做这个应用时,我真的不必担心这些。luminus会自动为你处理这一切。另外,使用Clj/script的优秀时间库( https://github.com/dm3/clojure.java-time / https://github.com/andrewmcveigh/cljs-time )你可以在中间件和前端上编写你相关的代码,并且它将按预期运行(……有细微的差异……)(……luminus还提供了必需的transit-adapter等东西(不确定是否真的这样称之)!!)
……无论如何,我选择了基于KISS原则的策略,我对此相当满意。随便你怎么理解吧 :-)