繁体   English   中英

有关数据库连接体系结构的设计难题

[英]Design puzzle about database connectivity architecture

我正在设计一个数据库浏览应用程序,该应用程序到目前为止一直支持MySQL,但是最近我也开始实现对Sqlite的支持,并且在设计实现连接体系结构的方式时遇到了一些麻烦。 这仅与“连接”部分有关(即:在其中获得用户/数据库/主机,或在sqlite中获得文件名),而不是数据库功能。 已经解决了。

我有一个基类“ Connection”,它公开了“普通”方法(例如name()或纯虚拟方法,例如virtual string fullLocation() = 0 ,它为我返回了一个可用于标识数据库的字符串(例如: MySql的database@host或Sqlite的/etc/mydb.sqlite )。

现在,用户当然需要指定他想连接的数据库,因此,他在应用程序的GUI中只需选择类型,然后填写凭据即可。 从这里开始,我的烦恼开始了。 我创建了一个MySqlConnectionSqliteConnection类,它们都从Connection派生,但是大多数情况下,我最终得到如下结果:

        Connection* c = 0;
        if(gui->engine_name() == "MYSQL")
        {
            string host = gui->getHost();
            string user = gui->getUser();
            string password = gui->getPassword();
            int port = gui->getPort();
            string db = gui->getDatabase();
            c = new MySqlConnection(host, user, password, db, port);
        }
        else
        {
            string dbFile = gui->getSqliteDbFile();
            c = new SqliteConnection(dbFile);
        }
        string meta = application->use_connection(&c);

而且我担心,由于这两个数据库引擎的本质不同,这种情况会在整个应用程序中继续发生。

您对如何以一种优雅的方式解决此问题有一些指导吗?

一种更优雅的方法是设计一个工厂类并在该工厂的GenerateConnection()方法中处理GUI输入:

void ConnectionFactory::GenerateConnection(Connection* c)
{
 if(gui->engine_name() == "MYSQL")
    {
        string host = gui->getHost();
        string user = gui->getUser();
        string password = gui->getPassword();
        int port = gui->getPort();
        string db = gui->getDatabase();
        c = new MySqlConnection(host, user, password, db, port);
    }
    else
    {
        string dbFile = gui->getSqliteDbFile();
        c = new SqliteConnection(dbFile);
    }

}

如果您不希望对gui依赖,则只需定义一个名为Parameters的结构并根据gui输入更新其实例,然后将此对象提供给连接工厂的连接生成方法。

您需要模式Factory,它将以抽象方式为您创建Connection。 这是肤浅的回答。 带有Builder模式的Factory将是不错的参数。 像这样:

 ParamBuilder *b = new ParamBuilder;
 if(gui->engine_name() == "MYSQL")
 {
      b->setHost(gui->getHost())
       ->setUser(gui->getUser());
       ->setPassword(gui->getPassword());
        ...
  }
  else
  {
      b->setFile(gui->getSqliteDbFile());
  }
  Connection *c = globalConnectionFactory->createConnection(b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM