Database Settings di NexaUI Framework

Pengenalan

NexaUI menyediakan sistem database yang fleksibel dan mudah dikonfigurasi untuk berbagai jenis database. Dokumentasi ini akan membahas cara mengkonfigurasi koneksi database, mengelola multiple connections, dan praktik terbaik untuk pengaturan database di aplikasi NexaUI.

Konfigurasi Database

Konfigurasi database di NexaUI disimpan dalam file config/database.php. File ini berisi pengaturan untuk berbagai driver database yang didukung, termasuk MySQL, PostgreSQL, SQLite, dan SQL Server.

<?php
// config/database.php

return [
    // Default database connection
    'default' => env('DB_CONNECTION', 'mysql'),
    
    // Database connections
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'nexaui'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],
        
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'nexaui'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],
        
        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'nexaui'),
            'username' => env('DB_USERNAME', 'sa'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
        ],
    ],
    
    // Migration table
    'migrations' => 'migrations',
    
    // Redis settings
    'redis' => [
        'client' => env('REDIS_CLIENT', 'predis'),
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 0),
        ],
        'cache' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => env('REDIS_CACHE_DB', 1),
        ],
    ],
];

Environment Variables

Sebagian besar pengaturan database menggunakan environment variables yang didefinisikan dalam file .env. Ini memungkinkan Anda untuk memiliki konfigurasi yang berbeda untuk setiap lingkungan tanpa mengubah kode.

# .env file
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nexaui_app
DB_USERNAME=nexaui_user
DB_PASSWORD=secret_password

Untuk lingkungan yang berbeda, Anda dapat memiliki file .env yang berbeda:

  • .env - Pengaturan lokal (tidak disimpan di version control)
  • .env.example - Template untuk file .env (disimpan di version control)
  • .env.testing - Pengaturan untuk lingkungan testing
  • .env.production - Pengaturan untuk lingkungan production

Menggunakan Database

Koneksi Database

NexaUI akan secara otomatis terhubung ke database menggunakan koneksi default yang dikonfigurasi. Anda dapat mengakses database menggunakan class DB:

use App\System\Database\DB;

// Query sederhana
$users = DB::query('SELECT * FROM users WHERE active = ?', [1]);

// Query builder
$users = DB::table('users')
    ->where('active', 1)
    ->get();

Multiple Connections

Anda dapat menggunakan koneksi database yang berbeda dengan method connection():

// Menggunakan koneksi MySQL
$users = DB::connection('mysql')->table('users')->get();

// Menggunakan koneksi SQLite
$logs = DB::connection('sqlite')->table('logs')->get();

Transactions

NexaUI mendukung database transactions:

DB::beginTransaction();

try {
    // Operasi database
    DB::table('users')->insert([
        'name' => 'John Doe',
        'email' => 'john@example.com',
    ]);
    
    DB::table('profiles')->insert([
        'user_id' => DB::lastInsertId(),
        'bio' => 'Lorem ipsum',
    ]);
    
    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
    throw $e;
}

Konfigurasi Lanjutan

Read/Write Connections

Untuk aplikasi dengan beban tinggi, Anda dapat mengkonfigurasi koneksi terpisah untuk operasi read dan write:

'mysql' => [
    'read' => [
        'host' => [
            'read-host-1.example.com',
            'read-host-2.example.com',
        ],
    ],
    'write' => [
        'host' => 'write-host.example.com',
    ],
    'driver' => 'mysql',
    'database' => env('DB_DATABASE', 'nexaui'),
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', ''),
    // Other options...
],

NexaUI akan secara otomatis menggunakan koneksi yang tepat berdasarkan operasi yang dilakukan.

Sticky Connections

Untuk memastikan konsistensi data dalam satu request, Anda dapat mengaktifkan sticky connections:

'mysql' => [
    'read' => [
        'host' => [
            'read-host-1.example.com',
            'read-host-2.example.com',
        ],
        'sticky' => true,
    ],
    'write' => [
        'host' => 'write-host.example.com',
    ],
    // Other options...
],

Connection Pooling

Untuk meningkatkan performa, Anda dapat mengkonfigurasi connection pooling:

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    // Other options...
    'pool' => [
        'min' => 5,
        'max' => 20,
        'timeout' => 30,
    ],
],

Database Migrations

NexaUI menyediakan sistem migrasi untuk mengelola struktur database. Migrasi disimpan dalam direktori database/migrations.

Konfigurasi Migrasi

Anda dapat mengkonfigurasi tabel yang digunakan untuk melacak migrasi:

'migrations' => 'migrations',

Menjalankan Migrasi

Untuk menjalankan migrasi, gunakan command:

php nexa migrate

Untuk menjalankan migrasi pada koneksi tertentu:

php nexa migrate --database=sqlite

Query Logging

Untuk debugging, Anda dapat mengaktifkan query logging:

'mysql' => [
    // Other options...
    'logging' => true,
    'log_level' => 'debug',
],

Query yang dijalankan akan dicatat di log aplikasi. Anda juga dapat mengakses query log secara programatis:

$queries = DB::getQueryLog();

Pengaturan Keamanan

SSL/TLS

Untuk koneksi yang aman, Anda dapat mengkonfigurasi SSL/TLS:

'mysql' => [
    // Other options...
    'ssl' => [
        'ca' => env('DB_SSL_CA', '/path/to/ca.pem'),
        'cert' => env('DB_SSL_CERT', '/path/to/cert.pem'),
        'key' => env('DB_SSL_KEY', '/path/to/key.pem'),
        'verify_server_cert' => true,
    ],
],

Perlindungan Password

Password database harus selalu disimpan di environment variables, bukan di file konfigurasi yang disimpan di version control.

Optimasi Performa

Connection Pooling

Seperti disebutkan sebelumnya, connection pooling dapat meningkatkan performa dengan menggunakan kembali koneksi database.

Query Caching

NexaUI mendukung query caching untuk meningkatkan performa:

// Cache query selama 60 detik
$users = DB::table('users')->cache(60)->get();

// Cache query dengan key kustom
$users = DB::table('users')->cache(60, 'all-active-users')->where('active', 1)->get();

// Hapus cache
DB::flushQueryCache('all-active-users');

Lazy Connections

Secara default, NexaUI menggunakan lazy connections, yang berarti koneksi database hanya dibuat ketika benar-benar diperlukan. Anda dapat mengubah perilaku ini:

'mysql' => [
    // Other options...
    'lazy' => false,
],

Database Seeding

NexaUI mendukung database seeding untuk mengisi database dengan data awal. Seeders disimpan dalam direktori database/seeders.

Menjalankan Seeders

Untuk menjalankan seeder, gunakan command:

php nexa db:seed

Untuk menjalankan seeder tertentu:

php nexa db:seed --class=UserSeeder

Praktik Terbaik

  • Gunakan Environment Variables - Simpan kredensial database di environment variables, bukan di file konfigurasi yang disimpan di version control.
  • Gunakan Migrasi - Kelola struktur database menggunakan migrasi untuk memudahkan deployment dan kolaborasi.
  • Batasi Akses Database - Gunakan user database dengan hak akses minimal yang diperlukan.
  • Gunakan Prepared Statements - Selalu gunakan prepared statements untuk mencegah SQL injection.
  • Optimalkan Queries - Gunakan indexing dan query yang efisien untuk meningkatkan performa.
  • Backup Reguler - Lakukan backup database secara reguler dan uji proses restore.
  • Monitor Performa - Pantau performa database dan identifikasi bottlenecks.

Troubleshooting

Koneksi Gagal

Jika koneksi database gagal, periksa:

  • Kredensial database (username, password)
  • Host dan port database
  • Firewall atau pengaturan keamanan jaringan
  • Apakah database server berjalan

Performa Lambat

Jika query database lambat:

  • Periksa indexing pada tabel
  • Optimalkan query dengan EXPLAIN
  • Pertimbangkan untuk menggunakan query caching
  • Periksa apakah database server memiliki sumber daya yang cukup

Kesimpulan

Pengaturan database yang tepat sangat penting untuk performa dan keamanan aplikasi NexaUI. Dengan mengikuti praktik terbaik dan memanfaatkan fitur yang disediakan oleh NexaUI, Anda dapat membangun aplikasi dengan akses database yang efisien, aman, dan mudah dipelihara.