在对JCR or RDBMS进行一些研究并阅读其他posts之后,我仍然不确定是否将JCR优先于JPA用于文档管理系统,该系统必须处理不同的文档类型,非常大的文件和很多来自许多用户的并发访问。
我考虑使用JCR的主要原因是因为文档看起来像内容,并且规范已经处理了随之而来的一些问题 - 主要是我对存储和版本控制感兴趣。另外,我想将文档内容封装在JCR实现中,并将JPA用于其他所有特定于应用程序的内容。
也许有人可以帮我解决剩下的问题:
更新:尽管已经详细回答了这个问题,但从更实际的角度来看,有人可能会更加关注它的使用。就个人而言,我越来越关注以下非技术相关问题:
答案 0 :(得分:4)
简短版本:文档是结构化或半结构化的内容。这是分层组织数据存储的用例。如果你不想为自己实现所有基本的dms / cms内容,你应该选择JCR(考虑到这一点,你可能是第一次这样做,而他们一直都是这样做的)。
长版本:JCR涵盖了规范的大部分文档或内容管理系统的基本用例,如版本控制,锁定,生命周期管理或参照完整性。此外,它允许您在不更改架构的情况下扩展数据(当然,您可以在模型中定义节点类型,但您不必这样做)。大多数JCR实现(如Jackrabbit)在后端使用数据库使它们比关系后端的抽象层“更多”。要处理大数据,您可以使用文件系统存储(比将每个二进制数据存储到数据库快得多),同时将结构化数据(节点和属性)存储在数据库中。
当你选择JPA时,你必须自己处理所有这些dms / cms的东西。当然你可以做到,但它已经在JCR实现中完成了更多的低级编程。每个模型更改都需要更改模式,并且表布局不是那么简单(您是否希望为文档创建一个大表,每个属性都是一列?您是否希望为每个文档类创建一个单独的表?你是否对生命周期建模,你如何建模版本?)
对于使用JCR的第一个跃点,我建议David's Model,将您的应用程序的所有内容都视为内容。我曾在一个项目中工作,我们决定不使用JCR和JPA,因此我们不必处理不同的API进行存储。
至少有一些JCR实现
顺便说一下。考虑到RESTful架构,JCR API和实现几乎完成了。因此,如果您考虑使用REST API,映射也会非常简单。此外,它允许消费者直接通过JCR API浏览内容,从而可以轻松地将内容集成到其他应用程序中(即只读),同时您必须使用JPA显示数据库的内部设计,从而使消费者合同更容易破解在变化。
关于你剩下的问题: