我正在try 判断像JackrabbitModeShape这样的内容存储库(JSR283),但我必须承认,我不明白首先解决了什么问题,即使它对项目来说是一个很好的 Select .你认为哪种情况是最好的解决方案?除了大小之外,它与关系数据库不是一回事吗?为什么?为指出真实世界的例子而加分.

提前谢谢您.

推荐答案

JCR存储库不同于RDBMS,因为JCR存储库:

  • 是分层的,允许您以与您的需求紧密匹配的 struct 来组织您的内容,并且相关信息通常存储在一起,因此易于导航
  • 是灵活的,允许内容适应和发展,使用可以完全"无模式"到完全受限的 node 类型系统(例如,像关系数据库)
  • 使用标准Java API(例如,javax.jcr)
  • 信息实际存储的抽象位置:许多JCR实现可以将内容存储在各种关系数据库和其他存储中,一些实现可以通过JCRAPI公开非JCR存储,还有一些实现可以将多个存储联合到单个虚拟存储库中.
  • 支持即时查询和全文搜索
  • 支持事件、锁定、版本控制和其他功能

你当然可以在自己的应用程序中构建所有或部分这些功能,但这可能与你的应用程序的主要目的相go 甚远.

哪些类型的应用程序可以从这些功能中受益?内容管理系统使用存储库已经有很长一段时间了,JCR(和JackRabb)确实是由于需要一个通用的标准API来访问不同的内容存储库而发展起来的(参见JSR-170JSR-283).

另一个例子是文档管理系统,它管理Electron 文件(通常是纸质文档的图像),并提供搜索和查询.DMSE使用存储库已有一段时间了.

工件管理系统可以使用存储库来管理数字工件(通常是文件)以及附加信息(元数据).JCR在这里工作得很好,因为您可以将元数据存储在与文件相同的位置:理解这些额外属性的人可以看到它们,而不关心这些属性的人不必看到它们.我知道Artifactory是一个使用JCR的Maven存储库实现.还有用于管理Web服务构件、数据服务构件和测试构件的存储库.

但是JCR存储库不是用来管理文件的.JCR使用 node 层次 struct 的简单概念,其中 node 可以包含命名属性(具有一个或多个值)和子 node .允许的属性和子 node 完全由 node 类型决定, node 类型可以根据需要逐个 node 进行更改和混合.JCR预定义了一些常用的内置 node 类型,如用于表示存储库中的文件和文件夹的类型.您可以重用这些内置类型、扩展它们或编写自己的类型.许多人主张几乎将Mixin用作方面或方面,这样,如果 node 需要采用某个方面,您只需向该 node 添加一个Mixin即可.

JCR旨在轻松支持将XML内容导入存储库,其中每个元素映射到一个 node ,每个属性映射到一个属性.很多东西都是用XML(或YAML或JSON)表示的,所有这些都可以很容易地表示并存储在JCR存储库中.举个例子,考虑一个存储配置信息的JCR存储库(通常可以存储在多个XML文件中).JCR可以对该信息进行版本化,允许从多个进程访问该信息,启用查询和搜索,并在内容更改时通知应用程序.

有几个关于JCR的很好的概述,其中有更多的细节和示例.其中几个是:

Database相关问答推荐

使用Postgres获取带有表架构的外键

mongodb聚合从另一个查询中获取值

我们可以在 CnosDB 中的单个数据库中创建的标签数量是否有限制?

华为Appcube中的对象字段类型

任何用于存储过程的静态代码分析工具?

Phonegap如何在android上保存永久数据

递归关系的数据库设计

如何开始使用 SQLCipher for android?

跨不同数据库创建视图

设计用于存储多人游戏的各种要求和统计数据的表格

如何在 Oracle 中找到指向一条记录的外键依赖项?

SQLite3 的动态类型

如何在构建时创建填充的 MySQL Docker 映像

行之间的 SQL 差异

数据库中一致且全面的地址存储的最佳实践

如果表不存在,如何使用 Derby Db 创建表

cURL 和 PHP 显示1

单元测试数据库

Web 应用程序的文件存储:文件系统、数据库和 NoSQL 引擎

列的 SQL Server 2008 千位分隔符