Intro
一個專案會有遇到需要操作多個資料庫的情境,然而多資料庫分離的Type一般分兩類:
-
同一Application分主資料庫和附屬資料庫,如分myapp與myapp_log兩個DB。
-
異質系統,若非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使用度,將異質系統另外分開但不影響主架構。
若異質系統真的搞到也需要同連線多資料庫,那資料夾架構就比照主連線辦理即可