【问题标题】:Persisting Protobuf messages to Database将 Protobuf 消息持久化到数据库
【发布时间】:2022-04-13 15:20:41
【问题描述】:

持久化使用 protobuf3 定义的数据的正确方法是什么。我正在使用 golang 和 Java,两者都支持 ORM。在带有 Hibernate 的 java 和带有 gorm 的 golang 中。这两个地方我都需要将生成的代码转换为相应的实体模型。我觉得为了让 ORM 可以理解,保持相同的对象结构更加痛苦。是否有任何数据库可以与 protobuf 对象一起使用。或者我可以在 protobuf 本身中定义对象之间的关系。

非常感谢任何帮助。

【问题讨论】:

    标签: java go serialization protocol-buffers


    【解决方案1】:

    根据定义,您的 ORM 正在处理对象。它不应该知道或关心网络上的序列化。我建议将 protobuf 消息反序列化为您的 ORM 习惯的对象并让它持久化。没有充分的理由将持久层耦合到网络协议。

    如果您摆脱 JPA 并使用基于文档的解决方案,直接存储 protobuf 序列化可能是有意义的。

    您必须决定 JPA 为您提供了多少价值。

    【讨论】:

      【解决方案2】:

      这个问题有一个不简单的解决方案。

      Protobuf 3 将 JSON mapping 标准化为消息。将消息序列化为 JSON 后,您有多种选择将其存储在数据库中。

      以下(以及更多)数据库可以存储 JSON 数据:

      • MariaDB
      • PostgreSQL
      • MongoDB

      【讨论】:

      • 如果你朝这个方向发展,就没有理由使用 ORM。正如您已经指出的那样,这对于 NoSQL 文档持久性技术来说是完美的,但对于使用 Java 对象的 JPA 持久性来说,这完全没有意义。
      • @duffymo 你是对的,只要消息是唯一存储在数据库中的对象。
      • 不过,此解决方案会忽略数据中的任何关系。
      • 许多种方式可以在保持向后兼容性的同时扩展 Proto。大多数这些方式不适用于官方的 JSON 映射。在大多数 Proto 升级中,您可能需要在整个数据库中重写所有关联的 JSON。
      【解决方案3】:

      虽然这个问题很老了,但是从那以后事情就发生了,苹果在 2018 年发布的 FoundationDB Record Layer 原生存储了 Protocol Buffer。

      【讨论】:

        【解决方案4】:

        在 Go 中,我不了解 gorm,但似乎使用 Ent(竞争 ORM)Protobuf 可以反序列化为用于数据库表/关系的完全相同的对象。 Ent's official tutorial

        需要注意的是,您使用 Ent 的 Golang 结构指定 Protobuf,而不是通过标准的 proto3 语言。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-19
          • 2021-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多