[SQL] 單一連線多資料庫設計模式 – (Multiple Catalogs Databases)

Intro

一個專案會有遇到需要操作多個資料庫的情境,然而多資料庫分離的Type一般分兩類:

  1. 同一Application分主資料庫和附屬資料庫,如分myapp與myapp_log兩個DB。

  2. 異質系統,若非API串接,也是有可能直接SQL Connection跨過去連線異質資料庫。


異質系統資料庫連線

異質系統連線沒甚麼設計模式,基本上必定需要另外設定一個連線,以PHP Yii2 Framework連線異質MySQL為例:

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=myapp',
            'username' => 'user',
            'password' => 'pass',
            'charset' => 'utf8',
        ],
        'dbOtherApp' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=db.other-app.com;dbname=maindb',
            'username' => 'other',
            'password' => 'other',
            'charset' => 'utf8',
        ],
//...

基本上另外創建設定異質DB連線設定,再給需要的Model或程式定義使用。


同連線多資料庫 (Multiple Catalogs)

第一點提到,同一Application分主資料庫和附屬資料庫,可以使用同一個DB Connection去跨連不同Database。幾個重點特性:

1. 僅用同一個Connection操作不同Databases (設定只需一組)

2. 單一Query可集合操作多資料庫,如做JOIN

設計模式上,DB Connection設定如上即可,利用Table Name前綴多定義指令資料庫名稱即可,如myapp_log.mytable。一樣拿PHP Yii2 Framework AR Model做範例:

class Mytable extends ActiveRecord
{
    public static function tableName()
    {
        return 'myapp_log.mytable';
    }
//...

Model/Entity資料夾分類

一般的Application在每個Model/Entity預先定義好Table,而資料夾的分類本篇建議如下:

Models/
├── _api/
    ├── otherApp
        └── Data.php
    └── thirdApp
        └── News.php
├── log/
    └── MyTableLog.php
└── MyTable.php

_api即為異質系統分類目錄,此架構是考量80/20使用度,將異質系統另外分開但不影響主架構。

若異質系統真的搞到也需要同連線多資料庫,那資料夾架構就比照主連線辦理即可

Leave a Reply

Your email address will not be published. Required fields are marked *