【问题标题】:Strategies for managing database schema in an application using an XML based modelling使用基于 XML 的建模在应用程序中管理数据库模式的策略
【发布时间】:2012-02-08 11:53:29
【问题描述】:

我正在处理的应用程序当前使用 MySQL 数据库。我们计划更改应用程序的架构以处理 XML 格式的数据。因此,应用程序的对象模型将由 XML 模式驱动。现在我们可以使用 JAXB 等工具进行 XML 解析并在内存中创建对象结构。 但是我看到的主要问题是:-

  1. 如何将对象结构映射到关系数据库中。我们可以在这里使用 Hibernate。
  2. 另一个问题是 XML 架构会定期更改,我们需要支持以前版本的架构。

我不确定处理第 2 项的最佳方法,因为随着架构版本数量的增加,数据库架构很容易开始变得臃肿,包含许多表。

所以我的主要问题是,从对象建模角度和数据库模式角度来看,管理此类版本更改的最佳策略是什么?

【问题讨论】:

  • 是的。架构的变化是进化的,所以我们需要支持现有的流程。您认为我们应该使用基于 XML 或对象的数据库吗?
  • 可能 - 或者可能像 Postgres 那样支持数据库模式定义中的继承。如果对模式的更改相对较小并且本质上主要是附加的,它可能会提供一些帮助。我不得不说我完全没有以这种方式使用 Postgres 的经验。
  • 您没有具体说明实体将发生的各种变化。更改是关系更改还是只是新属性(列)?此外,XML 是从哪里来的?您是否从 Web 服务中读取它,因此对于不同版本的架构,您将拥有不同的 Web 服务?我之所以问,是因为 JAXB 需要一个关于它将用于将您的 XML 映射到的类的参考点。
  • 我们既可以进行结构(关系)更改,也可以更改实体的属性。 XML 以 HTTP 消息的形式进入系统。我们将有一个消息解码器组件来解析 XML 消息并根据模式进行验证。需要支持多个版本的消息

标签: java mysql xml hibernate


【解决方案1】:

解决方案是:

不断丰富您的模式,但确保它向后兼容以前的模式,以便 JAXB 可以解析最旧和最新的基于模式的 XML 并将其映射到您的对象中。这意味着使用相同的目标更改您的数据库架构以具有与您要映射的旧实体兼容的架构;对于 JAXB 工作的所有版本,模式名称空间等也应该相同。我想你会有很多可以为空的列等。这在未来是有风险的,但如果做得好,它可以工作。

哦,现在我看到您编辑了您的评论并给了我更多信息:

由于架构不断变化,我建议跳过 JAXB。 JAXB 不是针对这些不断变化的。 Smooks(在 Eclipse 中安装 JBoss Tools 插件)是。它将允许您为每个不同版本的基于模式的 XML 定义不同的映射定义到您的 Hibernate 实体类。因此,通过这种方式,您将维护 Smooks 映射、Hibernate 实体类和数据库模式。关于数据库模式,有一些方法可以在不改变结构的情况下使其进化,但你必须牺牲参照完整性......我不会

我想你的问题有很多解决方案

【讨论】:

  • 对不起,我的措辞有点误导。 XML 模式将有许多版本。所以问题实际上是如何应对架构的多个版本,以及对数据库的影响。感谢 Smooks 的链接,以前没用过。
  • 由于您将有一个组件根据其架构验证 XML,这意味着您将能够区分使用哪个 Smooks 映射定义,以便将特定架构的 XML 映射到您的 Hibernate对象。数据库必须在结构上进行更新,以使所有模式都满意,这意味着 Hibernate 类也将在结构上受到影响。这当然意味着停机。这使得避免 JAXB 变得更加清晰,因为您将为每个模式拥有一组新的类,这意味着要为 VM 加载更多的类定义。
【解决方案2】:

XML 模式不断发展的特性意味着使用 JAXB 是不可扩展的,因为这意味着每次模式更改时都会静态生成一批新的类。系统必须支持所有以前版本的架构。

我决定使用XSOM 来解析XML 模式。这意味着可以在运行时动态选择和处理正确的模式版本。所以我们可以构建一个解析模式和实例化适当类的通用方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2018-01-28
    相关资源
    最近更新 更多