Yii2 / PHP: Абстрактный доступ к базе данных для InfluxDB и MySQL - PullRequest
0 голосов
/ 02 января 2019

В моем проекте Yii2 / PHP мне нужно объединить обе базы данных:

  • MySQL для метаданных, веб-интерфейс, ...
  • InfluxDB для данных измерений (большие данные временных рядов)

Чтобы уменьшить сложность, я бы хотел начать только с MySQL, а позже добавить InfluxDB.

Моя идея состоит в том, чтобы создать абстракцию / суперкласс для обеих баз данных (только для данных измерений), которые позволяют выполнять реализацию и выполнять тесты с MySQL и включают ускорение с InfluxDB на более поздней стадии проекта.

В абстракции должны быть методы для:

  • управление подключением к базе данных
  • запись данных
  • чтение данных (необработанные данные, агрегации)

Поскольку я не являюсь экспертом InfluxDB (пока): имеет ли эта архитектура смысл, или модели данных и схемы принципиально отличаются друг от друга, поэтому абстракция будет бесполезной? Есть ли какие-нибудь проекты для изучения?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Во-первых, вам нужно настроить базы данных, как показано в следующем примере, взять две базы данных mysql:

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;
}

Тогда:

Если вы установили db1 в методе getDb (), результат будет получен из db1 и т. д.

ModelName::find()->select('*')->all();
0 голосов
/ 02 января 2019

Я не уверен, что попытка поместить MySQL и InfluxDB в одну и ту же форму имела бы большой смысл.

Лучшим подходом IMHO было бы иметь какой-то вспомогательный класс для ваших вычислений (то есть: Stats :: getViews (), Stats :: getVisitors (), ..) сначала с использованием MySQL, а затем переписать его для использования InfluxDB, сохраняя методы подписи и форматы ответов.

...