Integrasi Sistem Dengan Postgres Foreign Data Wrapper

Ceritanya tahun 2014 silam dapet problem untuk integrasi sistem di sebuah perusahaan. Sebut saja PT Mario Luigi. Saat itu lagi kepingin cari alternatif solusi selain nulis API. Kebetulan FDW waktu itu lagi hot-hotnya.

PT Mario Luigi saat itu telah memiliki sebuah Aplikasi ERP yang mengelola puluhan cabang. Di departemen sumber daya manusia (SDM) ada pula Aplikasi SDM. Direktur utama ingin melihat secara real time beberapa metriks dalam bentuk layar dashboard. Berikut beberapa hal yang ingin diukur:

# Perolehan kontrak     : Total sales per unit kerja (Dalam Rupiah)
# Penyerapan kontrak    : Sales (kontrak yg sudah diproduksi dan diterima pelanggan) / jumlah kontrak 
# Profitabilitas SDM    : Laba bersih / per jumlah pegawai di setiap cabang
# Produktivitas SDM     : Total sales / jumlah pegawai di setiap cabang.

Informasi seputar kontrak, sales, laba terdapat di dalam database ERP. Sedangkan informasi pegawai terdapat di dalam database SDM. ERP & SDM kebetulan sudah sama-sama menggunakan postgres, Mari kita integrasikan kedua database agar dashboard pak direktur segera tampil.

DEMO

Skenarionya kita ingin load sebuah view dari database ERP ke dalam database SDM. View ini kemudian akan dikombinasikan dengan data di database SDM untuk menghasilkan informasi yang dibutuhkan oleh dashboard. Berikut detil langkah-langkahnya:

1. Buat sebuah view di database ERP. View ini berfungsi untuk me-resume kontrak, sales, dan laba per unit kerja. Jadilah view v_dashboard, dengan definisi kolom sbb :

   (
        unit_id         integer,
        tahun           integer, 
        bulan           integer,
        nilai_kontrak   numeric, 
        nilai_sales     numeric,
        laba_bersih     numeric
    ); 
Demi mempersingkat, DDL viewnya tidak usah kita pasang ya. Intinya view ini hanya mengolah data dari modul sales dan akuntansi.

2. Load ekstensi postgres_fdw ke dalam database sdm

CREATE EXTENSION postgres_fdw;

3. Buat definisi remote server (dalam hal ini server ERP)

 CREATE SERVER srv_erp 
 FOREIGN DATA WRAPPER postgres_fdw 
 OPTIONS (dbname 'db_perusahaan_xxx', host '192.168.70.10', port '9999');

4. Petakan sebuah user pada remote server, agar database utama (Aplikasi SDM) bisa mengakses remote server.

CREATE USER MAPPING for 
SERVER srv_erp
OPTIONS (user 'user_erp', password 'pass_erp');

5. Buat definisi foreign table ERP yg akan diimpor ke Aplikasi SDM.

CREATE FOREIGN TABLE v_dashboard 
    (
        unit_id         integer,
        tahun           integer, 
        bulan           integer,
        nilai_kontrak   numeric, 
        nilai_sales     numeric,
        laba_bersih     numeric
    )
SERVER srv_erp OPTIONS (table_name 'v_dashboard');

Selesai. Test akses view ERP langsung dari database SDM.

db_sdm=# SELECT * FROM v_dashboard;

Jrenggg.. akan muncul konten table/view yang terletak di database remote. Ajib.. Selanjutnya table tersebut tinggal diolah menggunakan bahasa kesayangan untuk dijadikan dashboard. Asiknya, foreign table dapat langsung kita mainkan persis seperti tabel lokal, Kita bisa langsung operasikan create, read, update, delete terhadapnya., perubahannya pun langsung tersimpan di database remote. Bahkan, table remote tersebut bisa direlasikan juga dengan database lokal !. Nikmat mana lagi yang kamu dustakan.

Jika kita pakai postgres 9.5 ke atas, foreign table tidak perlu didefinisikan ddlnya, cukup sebut saja nama skema/table yg ingin di impor. Impornya pun tidak terbatas hanya satu table saja, bisa liberal seperti berikut :

Impor semua table/view di bawah skema tertentu.
    IMPORT FOREIGN SCHEMA akuntansi
    FROM SERVER srv_erp INTO akuntansi_from_erp

Impor hanya table tertentu saja.
    IMPORT FOREIGN SCHEMA akuntasi 
    LIMIT TO (neraca,  
    laba_rugi, jurnal)
    FROM SERVER srv_erp INTO akuntansi_from_erp

Impor semua table di dalam skema, kecuali table tertentu.
    IMPORT FOREIGN SCHEMA akuntansi EXCLUDE (neraca)
    FROM SERVER srv_erp INTO akuntansi_from_erp;

Bonus

Untuk memonitor segala sesuatu terkait foreign table, kamu bisa lihat tabel berikut ini:

                    List of relations
   Schema   |          Name           | Type  |  Owner  
------------+-------------------------+-------+---------
 pg_catalog | pg_foreign_data_wrapper | table | postgres
 pg_catalog | pg_foreign_server       | table | postgres
 pg_catalog | pg_foreign_table        | table | postgres
 pg_catalog | pg_user_mappings        | table | postgres

Dan.. fdw tidak hanya untuk sesama postgres saja, fdw juga punya banyak driver : MySQL, Oracle, Informix, MSSQL-Server, Cassandra, MongoDB, Redis, CSV, JSON, dst. Iya beneran ini, postgres bisa konek secara langsung dengan sumber data tersebut, cukup pasang extension dan konfig seperti di atas. “BOOM !”, kita sudah bisa integrasikan banyak sumber data ke dalam satu tempat.

Kesimpulan

Dengan postgres fdw, kita bisa integrasikan banyak sumber data ke dalam satu tempat dengan mudah. Bila database ada di satu lingkungan, FDW akan memudahkan development ketimbang harus membuat API (consumer & producer) pada tiap sistem yg hendak diintegrasi.

Referensi
[1] https://wiki.postgresql.org/wiki/Foreign_data_wrappers