【问题标题】:Yii2/PHP: Abstracting Database Access for InfluxDB and MySQLYii2/PHP:为 InfluxDB 和 MySQL 抽象数据库访问
【发布时间】:2019-05-29 01:31:28
【问题描述】:

在我的 Yii2/PHP 项目中,我需要集成两个数据库:

  • 用于元数据、Web-UI 的 MySQL ...
  • 用于测量数据的 InfluxDB(大量时间序列数据)

为了降低复杂性,我想只从 MySQL 开始,稍后再添加 InfluxDB。

我的想法是为两个数据库(仅用于测量数据)创建一个抽象/超类,允许使用 MySQL 进行实现和执行测试,并在项目的后期使用 InfluxDB 加速。

抽象应该有以下方法:

  • 数据库连接管理
  • 写入数据
  • 读取数据(原始数据、聚合)

由于我还不是 InfluxDB 专家:这种架构是否有意义,或者数据模型和方案是否根本不同,所以抽象将毫无价值?有项目可以借鉴吗?

【问题讨论】:

    标签: mysql yii2 influxdb abstraction database-abstraction


    【解决方案1】:

    首先,你需要像下面这样配置你的数据库,这个例子需要两个 mysql db:

    return [
    'components' => [
        'db1' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db1name', //maybe other dbms such as psql,...
            'username' => 'db1username',
            'password' => 'db1password',
        ],
        'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=db2name', // Maybe other DBMS such as psql (PostgreSQL),...
            'username' => 'db2username',
            'password' => 'db2password',
        ],
    ],
    ];
    

    那么你可以简单地:

    // To get from db1
    Yii::$app->db1->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
    
    // To get from db2
    Yii::$app->db2->createCommand((new \yii\db\Query)->select('*')->from('tbl_name'))->queryAll()
    

    如果您使用的是活动记录模型,您可以在模型中定义:

    public static function getDb() {
        return Yii::$app->db1;
    }
    
    //Or db2
    public static function getDb() {
        return Yii::$app->db2;
    }
    

    然后:

    如果你在getDb()方法中设置了db1,结果会从db1中获取,以此类推。

    ModelName::find()->select('*')->all();
    

    【讨论】:

    • 感谢您的回答。在我项目的后期阶段,我想要两个数据库,用于元数据的 MySQL 和用于时间序列的 InfluxDB。我的问题只是关于处理时间序列,而不是完全替代我的 Yii2 应用程序中的数据存储。这个超类/接口应该如何构建/构建?
    【解决方案2】:

    我不确定将 MySQL 和 InfluxDB 放在同一个模型中是否有意义。

    恕我直言,更好的方法是为您的计算提供某种帮助类(即:Stats::getViews()、Stats::getVisitors()、..)首先使用 MySQL,然后重写它以使用InfluxDB,保持相同的方法签名和响应格式。

    【讨论】:

    • 为什么抽象在这里是个问题?相同的超类或接口可以帮助以后轻松切换。并且两者都有相似的逻辑:访问前连接,处理错误,相同的编写接口,...
    • 我也同意@WeSee
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2016-03-19
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多