【问题标题】:Storing a complex nested state存储复杂的嵌套状态
【发布时间】:2018-04-11 19:22:29
【问题描述】:

我有以下要求:

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

技术:

  • Java 弹簧
  • JPA 休眠
  • 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 是一个不错的选择吗?

【问题讨论】:

  • 当您说 postgres 不返回相同的订单时,您是指带有 json (postgresql.org/docs/10/static/datatype-json.html) 的 postgres 还是关系模型?使用关系映射,您可以使用任何顺序,只需添加一个额外的列进行排序(您不会返回到前端)。使用 json 你应该取回你输入的内容吗?至于对 json 进行排序,我会在 Java 中这样做。

标签: java postgresql jpa


【解决方案1】:

postgres 是个不错的选择吗?

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

就保存而言,您显然需要一个@JoinColumn @OrderColumn @OneToMany 子列表。我会提防@OrderColumn,因为它可能会引入严重的性能问题。

至于检索,大多数数据库都提供分层查询扩展,因此您可以尝试使用本机查询。参见例如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) 上创建索引可能会有所帮助。您可以尝试使用原生查询方法与 @OneToMany(fetch=EAGER) 来比较性能。

【讨论】:

    猜你喜欢
    • 2022-07-28
    • 2019-01-29
    • 2016-01-27
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2011-10-31
    相关资源
    最近更新 更多