存储复杂的嵌套状态

时间:2018-04-11 19:22:29

标签: java postgresql jpa

我有以下要求:

  • 存储复杂的深层嵌套对象
  • 能够跨所有嵌套元素更改GET请求中的顺序

技术:

  • Java Spring
  • JPA Hibernate
  • 的Postgres

json:

 [{
    "id": 1,
    "text": "test1",
    "children": [{
            "id": 2,
            "text": "test1"
        },
        {
            "id": 3,
            "text": "test1",
            "children": [{
                    "id": 4,
                    "text": "test1"
                },
                {
                    "id": 5,
                    "text": "test1"
                }
            ]
        }
    ]
}]

现在我有两个案例:

a)这个嵌套状态来自前端,我希望再次拥有完全相同的顺序(不幸的是postgres或mysql不一定给出你存储它的相同顺序)

b)我希望有可能通过以下方式订购这个深度嵌套的状态中的creationDate

由于性能原因,我不能在前端内压平状态(例如使用" parentId") - 扁平化是递归的并且非常昂贵。

你知道如何解决这个问题吗? postgres是一个很好的选择吗?

1 个答案:

答案 0 :(得分:0)

  

postgres是一个不错的选择吗?

和任何其他关系数据库一样可怕。如果将整个结构存储为字符串,解析并在代码中对其进行排序实际上证明是最高性能的解决方案,我不会感到惊讶。但是,如果您选择将其映射到关系模式...

就保存而言,您显然需要@JoinColumn @OrderColumn @OneToMany子列表。我对@OrderColumn持谨慎态度,因为它可能会引入严重的性能问题。

至于检索,大多数dbs都提供分层查询扩展,因此您可以尝试使用本机查询。参见例如Oracle的https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htmORDER SIBLINGS BY子句。 Postgres还允许递归查询,但语法有点复杂:https://www.postgresql.org/docs/9.1/static/queries-with.html

您的应用需要重新组合树,但我仍然期望比每个级别执行一个查询以检索层次结构更好的性能。在(id, parent_id)上创建索引可能会有所帮助。您可以尝试使用原始查询方法vs @OneToMany(fetch=EAGER)来比较性能。