我认为这个问题没有唯一的正确答案……但我建议你考虑以下……你决定使用关系型数据库(我认为这完全可以接受!)……因此,有人可能会说……首先,你的问题与 ER 模型等密切相关……而不仅仅是关于 Clojure…… :-)
……我的意思是什么……嗯……你提到了 ORM……当你在使用 Java 时,关系型和面向对象世界之间的“阻抗/范式不匹配”,很多时候会导致大量混乱/痛苦……等等。
好吧……但是当你使用 ORM 时,你确实会支付高昂的复杂度代价(我认为)……也就是说,如果你不仔细考虑你做的事情,例如 hibernate,它可能会产生最疯狂的事情/查询……例如,当天真地获取某种树结构时,生成的 SQL 可能相当愚蠢……当然,hibernate 非常强大……你可以集成非常复杂的缓存等等……尽管如此……要做得好/正确地使用 hibernate……我认为并不那么容易/直接……
所以...即便是使用Java,我也建议首先考虑Spring JDBC数据访问...因为...正如我所说的...JPA确实增加了不少复杂性...(因此,请自问一下,你是否真的需要JPA...)
...但无论如何,我想说的是,关系型数据库很棒...SQL很棒...PostgreSQL也棒!!!很多编程语言的麻烦就在于与关系型技术交互往往非常痛苦...所以我们开始构建各种工具,例如ORM等,以某种方式使生活更加容易...(...所以我们谈论的是疗法,而不是治愈...)
...现在,我想论证的是,使用Clojure,整个不匹配问题要轻微得多,因为Clojure不是围绕Person等类构建的,而是你有几个强大的集合,这样就足够了 :-)....
...所以让我们更具体一点...我已经使用Clojure(script)构建了这个闪卡SAP...
...现在,有很多我不太满意的地方...例如,我真的很想从Bootstrap切换到Bulma等等......这是我做的第一个非平凡规模的Clojure项目...所以显然我犯了很多错误...我会尽快尝试重构/改进这些东西...但主要难点是,我对PostgreSQL/关系型数据库部分最不担心...
....我用luminus模板设置了PostgreSQL项目...这个设置包括hugsql (一个拥抱SQL的Clojure库)....然后你可以进行DDL/模式设置...你的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会为您在幕后完成这一切...另外,使用优秀的cloj(script)时间库...( https://github.com/dm3/clojure.java-time / https://github.com/andrewmcveigh/cljs-time )....你可以编写你的时间相关代码...并且它将在中间件以及前端上生效(...会有一些轻微的例外...)(...luminus还提供了必要的transit-adapter? ( 不确定这个名字实际是否如此...) stuff also!!! )....
...无论如何...我选择了基于KISS原则的策略...对此我相当满意...请随意看待它...:-)