使用多个数据库模式

时间:2011-08-16 09:40:59

标签: java design-patterns database-schema

有第三方应用程序,我的应用程序访问该数据库。它的数据库模式已经多次更改,因此,现在大约有四种不同的数据库模式(不同的列,相同实体的不同选择条件)。

例如,有一个实体“应用程序”。对于不同的模式,可以通过以下方式检索:

1)SELECT * FROM apps WHERE cell_number < 65535 AND page_number < 65535 AND top_number = 65535

2)SELECT * FROM menu_item WHERE cell_number > -1 AND page_number > -1 AND parent_id = -1 AND component_name IS NOT NULL

等等......

那么,支持同一应用程序的不同版本的多个数据库模式的设计模式(在Java中)会更加舒适吗?当然,它应该为未来的变化做好准备。

2 个答案:

答案 0 :(得分:2)

这不是一件容易的事,因为很难将表结构映射到对象(现在经常使用ORM来执行此任务)。

从您的问题看来,将Application声明为抽象类或接口并提供不同的实现就足够了。

public abstract class Application(){
    public abstract Application getAnApplication();
}

public ConcreteApplicationOne(){
    public Application getAnApplication(){

      //retrieve application data from database scheama 1 , build object and return it.
    }
}

public ConcreteApplicationTwo(){
    public Application getAnApplication(){

      //retrieve application data from database scheama 2 , build object and return it.
    }
}

使用某种工厂来构建给用户正确的具体应用类:

公共类工厂{     public Application getApplicationImplementation(){          if(cond1){                返回new ConcreteApplicationOne();          } else {                返回new ConcreteApplicationTwo();          }     } }

答案 1 :(得分:1)

我相信你的问题的解决方案是在你的应用程序中定义你的数据类,并使用像Hibernate这样的ORM在你的数据库中生成数据库表。您需要检查迁移功能。请查看以下有关此主题的文章:

Hibernate and DB migration

将数据结构移动到主代码后,您将赢得以下内容:

  • 无需在两个地方和两种语言中维护代码和逻辑
  • 由于DB
  • 中没有逻辑,因此更易于测试
  • 可以自动生成迁移脚本