SaaS’teki Konum Darboğazı
<p>AgriTech platformları veya B2B lojistik panelleri gibi konum verilerine ihtiyaç duyan projelerde, bu verilerin doğru yönetimi hayati önem taşır. Geliştiriciler genellikle yakınlık aramaları (örneğin, "50 km çapında tüm çiftlikleri bul") için veritabanında standart <code>latitude</code> ve <code>longitude</code> değerlerini depolayarak Haversine formülü ile mesafeyi hesaplar. Bu yöntem, birkaç yüz kayıt için yeterli olsa da, platformunuz milyonlarca veri noktasına ulaştıkça bu yaklaşım veritabanınızı tamamen kilitleyebilir. CPU aşırı yüklenir, sorgular zaman aşımına uğrar ve API'niz durma noktasına gelir. Smart Tech Devs olarak bu darboğazı tamamen aşmak için PostgreSQL veritabanlarımızı <strong>PostGIS</strong> ile tasarlıyoruz.</p>
<h2>PostGIS'e Giriş: Kurumsal Coğrafi Mimari</h2>
<p>PostGIS, PostgreSQL için bir uzantıdır ve bu veritabanını mekansal bir veritabanı haline getirir. Koordinatları ham sayılar olarak işlemek yerine, yerel Geometri ve Coğrafya veri türlerini tanıtır. Daha da önemlisi, <strong>Mekansal İndeksler (GiST)</strong> kullanmanıza imkan tanır, bu da PostgreSQL'in fiziksel alanı standart metin veya tamsayıları arar gibi verimli bir şekilde arayabilmesini sağlar.</p>
<h3>Adım 1: Laravel Migration</h3>
<p>Laravel'de bunu uygulamak için öncelikle sunucumuzda PostGIS uzantısının aktif olduğundan emin olmalıyız, ardından migration dosyamızda bir mekansal sütun tanımlamalıyız.</p>
<pre><code>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class CreateFarmsTable extends Migration
{
public function up(): void
{
// 1. PostgreSQL veritabanında PostGIS uzantısını etkinleştirin
DB::statement(‘CREATE EXTENSION IF NOT EXISTS postgis;’);
Schema::create('farms', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->foreignId('tenant_id')->constrained();
// 2. Mekansal bir sütun tanımlayın. Standart GPS koordinatları için 'geography' kullanıyoruz.
// Bu, Dünya'nın eğriliğini otomatik olarak dikkate alarak doğru mesafeler sağlıyor.
$table->geography('location', subtype: 'point', srid: 4326);
$table->timestamps();
});
// 3. Hızlı sorgulamalar için mekansal GiST indeksi oluşturun
DB::statement('CREATE INDEX farms_location_gist ON farms USING GIST (location);');
}}
<h3>Adım 2: Hızlı Proximit Sorguları</h3>
<p>Artık tüm kayıtları PHP üzerinde çekip mesafeleri hesaplamak yerine, PostgreSQL'in mekansal motoruna işlemi yaptırıyoruz. Bunun için <code>ST_DWithin</code> fonksiyonunu kullanıyoruz. Bu, GiST indeksimizi kullanarak sonuçları milisaniyeler içinde döndürmemizi sağlıyor.</p>
<pre><code>namespace App\Repositories;
use App\Models\Farm;
use Illuminate\Support\Facades\DB;
class SpatialRepository
{
/
Belirli bir noktanın etrafında tüm çiftlikleri bulun.
*/
public function getFarmsWithinRadius(float $lat, float $lng, int $radiusInMeters)
{
// Kullanıcının koordinatlarından bir mekansal nokta oluşturun
$targetPoint = “ST_SetSRID(ST_MakePoint({$lng}, {$lat}), 4326)”;return Farm::query()
->whereRaw(“ST_DWithin(location, {$targetPoint}, ?)”, [$radiusInMeters])
// İsteğe bağlı olarak, kullanıcıya gösterilmek üzere tam mesafeyi seçin
->select(‘*’)
->selectRaw(“ST_Distance(location, {$targetPoint}) AS distance_meters”)
->orderBy(‘distance_meters’, ‘asc’)
->get();
}
}
<h2>Mühendislik ROI'si</h2>
<p>PostGIS'e geçiş yaparak, O(N) tam tablo taramasını O(log N) indeksli arama haline dönüştürmüş oluyorsunuz. Bu mimari, platformların mekansal verileri sonsuz bir şekilde ölçeklendirmesine yardımcı olur; büyük tarım haritalarını, hava durumu izleme koordinatlarını ve filo lojistiğini zahmetsizce yönetmelerini sağlar. Uygulama katmanında matematik yapmak yerine, veritabanınıza geometri işini bırakın.</p>Kaynak: Orijinal Makale


