我认为对于这个问题的唯一正确答案不存在……但我建议你考虑以下几点……你决定使用关系数据库(我认为那是完全可以的!)……因此可以争辩……首先,你的问题与 ER-modeling 等相关,而不是真正关于 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函数……你可以将这些参数以映射表的形式传递给这些预定义语句……并作为单一的记录的映射或n条记录的映射序列或nil返回你的输出……我想是这样的……
……对于执行转换等操作,你有一套基本但强大的Clojure函数,它们可以让地图和大序列变得容易处理……另外,当从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原则为基础的策略,而且我对此相当满意……你想怎么理解就怎么理解吧 :-)