使用基于特定列的Mongodb文档加入Postgresql行

时间:2015-01-02 12:41:25

标签: java spring hibernate mongodb postgresql

我在我的应用程序中使用MongoDB和PostgreSQL。需要使用MongoDB,我们可能会插入任意数量的新字段,我们将在MongoDB中存储数据。

我们将固定字段值存储在PostgreSQL中,并将自定义字段值存储在MongoDB中。

E.g.

**Employee Table (RDBMS):**
id       Name       Salary
1        Krish      40000

**Employee Collection (MongoDB):**
{
    <some autogenerated id of mongodb>
    instanceId: 1 (The id of SQL: MANUALLY ASSIGNED),
    employeeCode: A001
}

我们从SQL获取记录,并从他们的ID中获取MongoDB中的相关记录。然后映射结果以获取新字段的值并在UI上发送。

现在我正在寻找一些优化的解决方案,以便在PostgreSQL POJO / Model中获取MongoDB结果,因此我不必通过传递SQL的id然后再次映射来从MongoDB手动获取数据。

有没有什么方法可以通过列连接MongoDB和PostgreSQL(这里是RDBMS的Id和MongoDB的instanceId),这样只需一次获取,我就可以获得相关的Mongo结果。任何类型的返回类型都是可以接受的,但我需要一次通话。

我在我的应用程序中使用了Hibernate和Spring。

2 个答案:

答案 0 :(得分:2)

使用Spring Data可能是您用例的最佳解决方案,因为它同时支持:

  • JPA
  • MongoDB的

您仍然可以在一个请求中获取所有数据,但这并不意味着您必须使用单个数据库调用。您可以进行一次服务调用,该调用跨越twp数据库调用。因为PostgreSQL行可能是主要实体,所以我建议你与MongoDB共享PostgreSQL主键。

不需要单独的ID。这样,您可以使用相同的ID简单地获取SQL和Mongo文档。共享相同的ID可以为您提供同时处理这些请求并在从服务调用返回之前合并结果的优势。因此,服务方法持续时间不会占用两个存储库调用的总和,这是调用的最大值。

答案 1 :(得分:1)

令人惊讶的是,你有可能。有一个名为foreign data wrappermongo_fdw允许PostgreSQL查询MongoDB。我没有使用它,也没有关于它的性能,实用性或质量的意见。

如果你能通过Hibernate有效地使用它,我会非常惊讶,除非你能说服Hibernate FDW映射的“表”只是视图。如果你想在Java级别这样做,你可能会有更多的运气{/ 3}。

另外,这听起来像是设计的怪异。有一些理智的方法可以在一个体面的RDBMS中做你想做的事情,而不需要去混合数据库平台。混合动力有时间和地点,但我真的怀疑你的情况证明了复杂性。

EclipseLink and their "NoSQL" support支持动态映射。或者使用传统选项,例如将json存储为文本字段,存储XML,甚至是EAV映射。不要构建Just use PostgreSQL's json / jsonb support