Apa itu Multi-tenancy?
Multi-tenancy adalah arsitektur di mana satu aplikasi melayani banyak tenant (klien/organisasi) dengan data yang terisolasi. Setiap tenant hanya bisa melihat datanya sendiri.
Strategi Multi-tenancy
1. Single Database, Shared Tables
Semua tenant berbagi tabel yang sama, dibedakan oleh kolom tenant_id.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id),
name VARCHAR(200),
created_at TIMESTAMP DEFAULT NOW()
);
-- Query SELALU filter by tenant_id
SELECT * FROM projects WHERE tenant_id = 42;
-- Index wajib pada tenant_id
CREATE INDEX idx_projects_tenant ON projects(tenant_id);
2. Single Database, Separate Schemas
-- Setiap tenant punya schema sendiri
CREATE SCHEMA tenant_42;
CREATE TABLE tenant_42.projects (...);
-- Switch schema berdasarkan tenant
SET search_path TO tenant_42;
3. Separate Databases
-- Setiap tenant punya database sendiri
CREATE DATABASE tenant_42_db;
-- Isolasi penuh, tapi management lebih kompleks
Perbandingan
- Shared Tables — paling sederhana, hemat resource, risiko data leak jika lupa filter
- Separate Schemas — isolasi lebih baik, migration harus dijalankan per schema
- Separate Databases — isolasi penuh, tapi mahal dan kompleks
Tips Keamanan
// Middleware global untuk scope semua query
// Laravel example
public function handle($request, Closure $next)
{
$tenantId = auth()->user()->tenant_id;
// Global scope: otomatis filter semua query
Project::addGlobalScope('tenant', function ($query) use ($tenantId) {
$query->where('tenant_id', $tenantId);
});
return $next($request);
}