Java EE中的动态类型表/模型?

时间:2010-04-18 16:13:35

标签: java database model java-ee data-modeling

通常在创建Model时使用Java EE,我们在编译之前通过XML或注释定义字段和字段类型。有没有办法在运行时更改它们?或者更好的是,是否可以在运行时根据用户的输入创建新模型?这样,列数和字段类型是动态的(在运行时确定)?

非常感谢帮助。谢谢。

我觉得有必要澄清自己。

  1. 是的,在谈到模型时,我的意思是数据库建模。

  2. 至于用例,我想为用户提供一种定义和创建自己的表的方法。无需灵活性。但是必须有一定程度的自由:例如用户可以定义描述其产品所需的字段。

4 个答案:

答案 0 :(得分:2)

您听起来希望能够在运行时根据用户输入更改对象和架构。这听起来像是一个混乱的灾难食谱给我。我从来没有见过它。

我已经看到了将外键关系结合到名称/值对的通用表中的一般模式,但是这些抽象往往变成无限灵活的抽象,在性能方面既不容易理解也不能以自己的方式摆脱。< / p>

我打赌你的用户真的不想要无限的灵活性。我告诫你不要采取这个方向。更好地直接了解您的实际用例。

当然,一切皆有可能。我的直接经验告诉我,如果你能把它拉下来,你的用户会讨厌这个坏主意。祝你好运。

答案 1 :(得分:1)

这在某种程度上可能使用元建模技术:

  • 数据库级别的表/列/类型表
  • Java级别的键/值结构

但是这有明显的局限性(缺乏强类型对象)并且恕我直言会很快变得非常复杂(甚至不确定如何处理关系)。我不会使用这种方法来完全定义域对象,而只是扩展现有的对象(产品,文章等)。

如果我记得很清楚,这就是一些电子商务解决方案(例如BroadVision)正在做的事情。

答案 2 :(得分:1)

我在一个我们有这种设施的系统上工作。为了保持高效,我们将为客户架构动态生成/更改表。我们还需要嵌入元模型(模型模型)来动态处理实体中的信息。

选项1:使用自定义表格,您可以获得充分的灵活性,但同时也会显着增加复杂性,尤其是现有数据的更新/迁移。以下列出了您需要考虑的事项:

  • 如果列的类型发生变化怎么办?
  • 如果添加了一个列怎么办?是否有默认值?
  • 如果删除了一个列怎么办?我可以丢弃现有信息吗?
  • 如何管理列的重命名?
  • 如何在数据库之间移植?
  • 如何在数据库级别(例如索引)提高效率?
  • 如何管理人为错误(例如,用户删除列然后改变主意)?
  • 如何在客户站点安装新版本的系统时管理迁移(脚本,部署等)?
  • 如何使用ORM进行此操作?

选项2:轻量级替代方案是在不同类型的业务表中添加一些“备用”列(例如:“USER_DATE_1”,“USER_DATE_2”等)我见过那几次。它会让你的DBA尖叫,并不是一个好的做法,但至少可以促进一些事情,例如(迁移脚本,ORM集成)。

选项3:另一种选择是将所有内容存储在具有结构属性/数据的表中。但是,这对数据库性能来说确实是一场灾难。任何不完全微不足道的东西都需要很多连接。 DBA会尖叫得更多。

选项4:它是选项2和3的混合。核心表是固定的,但可以使用带有属性/数据的表以某种方式扩展它们。

总结:在你走这条路之前要三思而后行。它可以完成,但对应用程序的设计和维护有重大影响。

答案 3 :(得分:0)

我想我自己找到了一个很好的答案。那些新的no-sql(hbase,cassandra)数据库似乎正是我想要的。谢谢大家的答复。