我认为这个问题的答案并非唯一……但我建议你考虑以下……你选择使用关系数据库(我认为这很合适!)……所以有人可能会争辩说……首先,你的问题是与ER建模等相关,而不是与Clojure本身相关。:-)
……我的意思是什么……嗯……你已经提到了ORM。当你使用Java时,关系世界和面向对象世界之间的“阻抗/范例不匹配”通常会导致大量的杂乱/头痛……等等。
好吧……但当你使用ORM时,你会付出巨大的代价(我认为如此),也就是说,如果你不谨慎于你所做的事情,比如Hibernate,可能会生成一些极度荒谬的查询……比如在笨拙地获取某种树形结构时,生成的SQL可能相当愚蠢。显然,Hibernate真的很强大……你可以集成非常复杂的缓存等等。但是,我认为要做好Hibernate并不是那么容易/简单。
所以,即使是使用Java,我也建议首先考虑使用Spring JDBC数据访问,因为……正如我所说的,JPA确实增加了许多复杂性。(……因此,问问你自己你是否真的需要JPA。)
……无论如何,我想说的是,关系数据库很棒,SQL很棒,PostgreSQL很棒!!!许多编程语言的缺点就是,与关系技术交互往往真的很痛苦,所以你开始建立各种工具(如ORM等)来让你的人生更加顺利。(……我们在谈论疗法,而不是疗法。)
……现在我想争辩的是,由于Clojure不是围绕Person等类构建的,而是有一些强大的集合,所以Clojure的整个不匹配问题要小得多,所以你就可以继续前行了。:-)
……所以让我们更具体一点,我已经使用Clojure(script)构建了这个闪卡SAP。
……现在,我对很多事都不是太满意。例如,我真的想从Bootstrap过渡到Bulma等等。这是我做的第一个非平凡的Clojure项目,所以显然我犯了很多错误。我将会尽快进行重构/改进。但主要观点是我最不担心的是PostgreSQL/关系型数据库这部分。
……我使用了Luminus模板来设置PostgreSQL项目。这个设置包括hugsql(一个拥抱SQL的Clojure库)。然后你可以在完全不依赖于任何应用程序编程语言的情况下进行DDL/模式等设置,你的PostgreSQL查询,存储过程等等等。这样太棒了!此外,假设我想从Clojure切换到Java/Node等任意语言,我的整个数据库/持久层东西可以基本上保持原样,因为有了hugsql,你实际上只是在做SQL。还有非常少的元配置东西你放在评论里。通过这些评论,你将得到可以用来运行查询的Clojure函数。你可以用map的形式将这些参数传递给这些预处理语句,并得到对于一个或n个记录的map形式的输出,以及对于没有记录的nil。我想是这样的。
... 对于进行变换等操作,您拥有所有的基本但强大的Clojure函数,使按摩映射和序列变得轻而易举......还总会有一点点类型转换的东西......从PostgreSQL到Java,从Java到JS时......但如果您使用Luminus,您将会直接获得这些辅助工具......所以比如在我的闪卡应用中,我有许多时间戳......(...你是什么时候得到某张卡片正确答案的,你什么时候离开了评论等等等等......)......并且日期类型一直都很棘手......java.sql、java.util、joda等等......但当我开发这个应用时,我真的不需要担心任何这些事情......Luminus会为您在幕后处理好这些事务......另外......使用优秀的Clojure/Script时间库......( https://github.com/dm3/clojure.java-time / https://github.com/andrewmcveigh/cljs-time )......您可以编写您的与时间相关的代码......它将在中间件以及前端上都能工作......( ...有些小的例外......)......(... Luminus还提供了需要的transit-adapter?...不是很确定它是不是这个名字...) 等等的东西!!...
...无论如何......我遵循了简单原则的基于策略,我对此非常满意......你们可以随意评估......:-)