配置具有多个数据库连接的php应用程序

配置具有多个数据库连接的php应用程序,php,database-design,Php,Database Design,我有一个包含多个数据库的php页面。我一直在读到多个数据库是不好的,您应该将它们合并到一个数据库中,但为了更好地组织,我想将它们分开 假设我使用多个数据库。那么糟糕吗?现在我发现mysql\u max\u连接存在问题。所以我正在研究获取连接的单例方法。但是单例类似乎只用于一个数据库连接。是这样吗?我是否需要为每个数据库创建单独的单例类 澄清:我预计数据库会变得相当大。我已经在一个数据库上有几百个表,更多的表添加了新内容。我听说在任何特定的数据库中都不需要超过几千个表。也许最好的解决办法是以某种方

我有一个包含多个数据库的php页面。我一直在读到多个数据库是不好的,您应该将它们合并到一个数据库中,但为了更好地组织,我想将它们分开

假设我使用多个数据库。那么糟糕吗?现在我发现mysql\u max\u连接存在问题。所以我正在研究获取连接的单例方法。但是单例类似乎只用于一个数据库连接。是这样吗?我是否需要为每个数据库创建单独的单例类


澄清:我预计数据库会变得相当大。我已经在一个数据库上有几百个表,更多的表添加了新内容。我听说在任何特定的数据库中都不需要超过几千个表。也许最好的解决办法是以某种方式将所有内容组合起来,但这需要进行一次大的检修,因此我希望坚持使用多个数据库。我只想知道组织多个数据库连接的最有效方法是什么。

使用多个数据库相当简单。mysql_connect()返回一个资源值,用于标识连接。例如,您可以将该值添加到mysql\u query():


使用多个数据库相当容易。mysql_connect()返回一个资源值,用于标识连接。例如,您可以将该值添加到mysql\u query():


我不确定我是否理解这个问题,你的意思是“所以我正在研究获取连接的单例方法”,我知道单例是什么,但我真的不明白你打算做什么。此外,我不明白mysql\u max\u连接与所有这些有什么关系,它与您的要求完全无关

我可能建议您为所有数据库创建一个公共接口,比如一个名为“DB”的包装类(如果您愿意,可以作为单例),并定义一些方法来查询数据库,这样被调用方就不必“知道”从哪个DB获取数据

但所有这些似乎都毫无意义

编辑:(另见评论)

1) 要显著减少连接数,请使用mysql_pconnect()。但是仔细阅读文档,我知道有一些问题

2) 通用代码。这需要做很多工作,但值得。我这样做:

  • 我创建了一个查询存储库,其中包含一组查询,每个查询都有一个敏感的标题和一些SQL代码,如“SELECT foo,bar FROM foobar WHERE bar=”
  • 我用一个名为query(或类似的函数)的函数创建了一个DB类,它接受查询名称和查询参数作为数组,并透明地构建acual查询字符串,在该查询类型的适当数据库上执行它
  • 该函数返回一个对象的句柄,该对象可以遍历查询结果,与mysql\u fetch\u数组非常相似,但更好
如果将来您要删除mysql进行其他操作,它将在不更改被调用方代码的情况下工作。如果您合并这两个数据库,情况也是如此

编辑(2):哦,看来我终于明白你的要求了。你的数据库(或更好的模式)不止一个,但DBMS只是在localhost上运行的MySQL的一个实例?如果是这样,你可以简单地编辑你的查询。
“SELECT*FROM database.table WHERE…”

我不确定我是否理解了这个问题,您的意思是什么,“所以我正在研究获取连接的单例方法。”“,我知道什么是单身,但我真的不明白你打算做什么。此外,我不明白mysql\u max\u连接与所有这些有什么关系,它与您的要求完全无关

我可能建议您为所有数据库创建一个公共接口,比如一个名为“DB”的包装类(如果您愿意,可以作为单例),并定义一些方法来查询数据库,这样被调用方就不必“知道”从哪个DB获取数据

但所有这些似乎都毫无意义

编辑:(另见评论)

1) 要显著减少连接数,请使用mysql_pconnect()。但是仔细阅读文档,我知道有一些问题

2) 通用代码。这需要做很多工作,但值得。我这样做:

  • 我创建了一个查询存储库,其中包含一组查询,每个查询都有一个敏感的标题和一些SQL代码,如“SELECT foo,bar FROM foobar WHERE bar=”
  • 我用一个名为query(或类似的函数)的函数创建了一个DB类,它接受查询名称和查询参数作为数组,并透明地构建acual查询字符串,在该查询类型的适当数据库上执行它
  • 该函数返回一个对象的句柄,该对象可以遍历查询结果,与mysql\u fetch\u数组非常相似,但更好
如果将来您要删除mysql进行其他操作,它将在不更改被调用方代码的情况下工作。如果您合并这两个数据库,情况也是如此

编辑(2):哦,看来我终于明白你的要求了。你的数据库(或更好的模式)不止一个,但DBMS只是在localhost上运行的MySQL的一个实例?如果是这样,你可以简单地编辑你的查询。
“从database.table中选择*,其中…”

典型的单例如下所示:

class Singleton{
    private static $instance;
    private function __construct(){}
    private function __clone(){}
    public function Instance(){
        if(!self::$instance){
            self::$instance = new self;
        }
        return self::$instance;
    }
}
但您可以通过拥有多个实例来扩展它,但每个实例略有不同:

class MultiSingleton{
    private static $instance = array();
    private function __construct(){}
    private function __clone(){}
    public function Instance($index = 'default'){
        if(!isset(self::$instance[$index])){
            self::$instance[$index] = new MultiSingleton($index);
        }
        return self::$instance[$index];
    }
}

这样,您就可以有一个类来管理所有的类;)并且仍然遵循单例模式

典型的单例如下所示:

class Singleton{
    private static $instance;
    private function __construct(){}
    private function __clone(){}
    public function Instance(){
        if(!self::$instance){
            self::$instance = new self;
        }
        return self::$instance;
    }
}
但您可以通过拥有多个实例来扩展它,但每个实例略有不同:

class MultiSingleton{
    private static $instance = array();
    private function __construct(){}
    private function __clone(){}
    public function Instance($index = 'default'){
        if(!isset(self::$instance[$index])){
            self::$instance[$index] = new MultiSingleton($index);
        }
        return self::$instance[$index];
    }
}

这样你就可以有一个类来管理所有的数据库;)并且仍然遵循单例模式

澄清你的问题。此外,如果你以这种方式“组织”你的数据库,你真的需要重新考虑方法。只有在你不能不合并它们的情况下,你才会使用多个数据库。其他