Ana Sayfa  •  Hakkında  •  Hızlı Başlangıç  •  Tutorial  •  Benchmark  •  Locale  •  SQL Rehberi  •  Changes  •  Wiki  •  English

SQL ile Karşılaştırmalı AmberDB Kullanım Rehberi

Bu kılavuz, geleneksel ilişkisel veritabanı (RDBMS / SQL) deneyimi olan geliştiricilerin AmberDB'ye hızla adapte olabilmesi için hazırlanmıştır. Kuramsal ve felsefi detaylar yerine, "SQL'de şu şekilde yapılan işlem AmberDB'de şu şekilde yapılır" yaklaşımıyla doğrudan çalışan kod örneklerine odaklanır.

İçindekiler

  1. Geliştiricinin Bilmesi Gereken Temel Notlar (Hızlı Giriş)
  2. Temel CRUD İşlemleri (DML)
  3. Sorgulama, Filtreleme ve Arama (SELECT, WHERE, LIKE)
  4. Sıralama (ORDER BY) ve Alfabetik Yerelleştirme (Collation)
  5. İlişkiler ve JOIN Mantığı (En Büyük Mimari Fark)
  6. Gruplama ve Filtre Sayaçları (GROUP BY vs. Facet)
  7. İşlem Güvenliği ve ACID (Transactions: COMMIT & ROLLBACK)
  8. Veri Tanımlama (DDL: CREATE TABLE vs. AmberDB Şeması)
  9. SQL'de Harici Kod Gerektiren Yerleşik AmberDB Artıları
  10. Hızlı Referans ve Kopya Kağıdı (Cheat Sheet)
  11. Kavramlar Sözlüğü (Terminology Glossary)

1. Geliştiricinin Bilmesi Gereken Temel Notlar (Hızlı Giriş)

AmberDB ile kod geliştirmeye başlamadan önce bilmeniz gereken 4 pratik kural:

  1. Ayrı Bir Veritabanı Sunucusu Yoktur: MySQL veya PostgreSQL gibi bir servis başlatmanız veya ağ bağlantısı kurmanız gerekmez. AmberDB, uygulamanızın içine bir Perl nesnesi olarak dahil edilir ve doğrudan yerel diskte çalışır.
    use AmberDB;
    my $adb = AmberDB->new(
        cfg  => { user => 'admin', language => 'tr' },
        path => { dbase_dir => './dbstore' }
    );
    
  2. Kayıtlar Doğal Perl Dizileridir (@record): SQL'deki tablo satırı, AmberDB'de ($id, $alan1, $alan2, ...) şeklinde bir Perl dizisidir.
  3. 0. İndis Daima Primary Key ID'dir: Dizinin 0. elemanı ($record[0]) kaydın benzersiz kimliğidir. Yeni kayıtlarda buraya 0 veya undef verilir; insert_id çağrısı otomatik artan ID'yi üretir.
  4. Sütun İsimleri Yerine Blok Numaraları: SQL'deki name, price, status sütun adları yerine tablodaki pozisyonel blok indisleri (1, 2, 3...) kullanılır. Alanlarda düz skalar değerlerin yanı sıra iç içe ARRAY veya HASH referansları da doğrudan saklanabilir.

[!NOTE] AmberDB'nin derin mimari altyapısı, disk dosya formatları ve benchmark sonuçları için AmberDB Hakkında, Kapsamlı Tutorial ve Benchmark Raporu sayfalarına başvurabilirsiniz.

2. Temel CRUD İşlemleri (DML)

2.1 INSERT (Tekil Kayıt Ekleme)

2.2 BULK INSERT (Toplu Kayıt Ekleme)

2.3 SELECT by ID (Birincil Anahtarla Okuma)

2.4 UPDATE by ID (Kayıt Güncelleme)

2.5 BULK UPDATE (Toplu Güncelleme)

2.6 DELETE (Kayıt Silme & Soft-Delete)

2.7 BULK DELETE (Toplu Silme)

2.8 COUNT(*) (Kayıt Sayısı)

3. Sorgulama, Filtreleme ve Arama (SELECT, WHERE, LIKE)

3.1 Tekil Değer Eşleşmesi (WHERE field = value)

3.2 Çoklu Değer Listesi (WHERE id IN (...))

3.3 Metin Arama (WHERE col LIKE '%...%' / FTS)

3.4 Çok Kriterli Filtreleme (WHERE A = x AND B = y)

3.5 Sayfalama (LIMIT & OFFSET)

4. Sıralama (ORDER BY) ve Alfabetik Yerelleştirme (Collation)

4.1 Sayısal ve Alfabetik Sıralama

4.2 Türkçe ve Çok Dilli Karakter Sıralaması (Collation)

5. İlişkiler ve JOIN Mantığı (En Büyük Mimari Fark)

Geleneksel ilişkisel SQL ile AmberDB arasındaki en büyük zihniyet ve performans farkı ilişkisel verilerin modellenmesindedir.

5.1 SQL Normalize Tablo + JOIN Modeli

SQL'de bir siparişin kalemlerini ve müşteri ilişkisini tutmak için en az 3 ayrı tablo ve bunları bağlayan yabancı anahtarlar (Foreign Keys) gereklidir:

-- 1. Siparişleri ve Kalemleri Bulmak için SQL JOIN:
SELECT o.id AS order_id, o.customer_name, oi.product_id, oi.quantity, p.name AS product_name
FROM orders o
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE oi.product_id = 101;

Maliyet: 3 ayrı B-Tree indeks taraması, çoklu disk I/O, geçici tablo belleği ve CPU sorgu planlama yükü.

5.2 AmberDB İç İçe Belge + match_block Tersine İndeks Modeli

AmberDB'de sipariş kaydı, kalemlerini kendi içinde doğal bir Perl iç içe dizi referansı (ARRAY ref) olarak barındırır:

# 1. Sipariş Kaydının Yapısı (@order):
my @order = (
    0,                             # [0] Sipariş ID (Örn: 5001)
    "Ahmet Yılmaz",                # [1] Müşteri Adı
    "2026-09-06",                  # [2] Tarih
    [                              # [3] Kalemler (İç içe ARRAY): [ [ ÜrünID, Adet, Fiyat ], ... ]
        [ 101, 2, 149.99 ],
        [ 105, 1,  49.90 ],
    ],
    { status => "kargoda" }        # [4] Ek Bilgiler (HASH ref)
);

# Siparişi kaydet:
my $order_id = $adb->insert_id("orders", @order);

Şema dosyasında (orders.table) Blok 3 eşleştirme listesine eklenir:

{
    match_block => [ 3 ], # Blok 3 içindeki tüm alt dizi elemanlarını otomatik indeksle
}

"101 nolu ürünü içeren tüm siparişleri getir" Sorgusu:

6. Gruplama ve Filtre Sayaçları (GROUP BY vs. Facet)

E-ticaret ve arama sayfalarında kullanıcıların sol tarafta gördüğü "Sony (12), Apple (8), Samsung (5)" gibi kategori filtre sayaçları SQL'de GROUP BY ile hesaplanır.

7. İşlem Güvenliği ve ACID (Transactions: COMMIT & ROLLBACK)

AmberDB, çökmelere karşı korumalı geri alma günlüğü (undo-log) ve Strict 2PL (Two-Phase Locking) transaction desteğine sahiptir.

8. Veri Tanımlama (DDL: CREATE TABLE vs. AmberDB Şeması)

9. SQL'de Harici Kod Gerektiren Yerleşik AmberDB Artıları

SQL veritabanı kullanan projelerde geliştiricilerin harici kütüphaneler, trigger'lar, ayrı önbellek sunucuları veya Cron betikleriyle çözdüğü birçok operasyon AmberDB'de çekirdek motora dahildir:

| Özellik | Geleneksel SQL Dünyasında Çözüm | AmberDB'deki Yerleşik Çözüm | |---|---|---| | Otomatik SEO URL Slug | Uygulama kodu, harici slugify kütüphaneleri, çakışma kontrolü için veritabanı sorguları. | slug_block => [1] tanımlandığında motor başlık değiştiğinde /urun/sony-wh-1000xm5 URL'ini otomatik üretir ve çakışmaları çözer (get_slug). | | Kullanıcı İşlem Denetimi (Audit Log) | Ekstra audit tablosu, trigger'lar veya ORM middleware kodları. | log_owner => 1 tanımlandığında her ekleme/güncelleme .aut dosyasına işlenir. $adb->auth_view("tablo", $id) ile HTML raporu alınır. | | Yüksek Hızlı Bellek İçi Önbellek ve Geçici Veri (RAM-Disk) | Disk I/O darboğazını aşmak veya geçici oturum/sepetleri tutmak için harici bir önbellek sunucusu (Redis veya Memcached) kurup yönetmek, ağ gecikmesi (TCP) ve senkronizasyon kodlarıyla uğraşmak. | Ayrı bir sunucu veya servis kurmadan; süreç içi L1 bellek nesne önbelleği (set_cache, get_cache) ve işletim sistemi paylaşımlı belleği (RAM-Disk) üzerinde doğrudan çalışan yerel tablo motoru (use_ramdisk, ramdisk_*). Sıfır ağ gecikmesi, sıfır harici servis bağımlılığı. | | Güvenli Silme (Soft-Delete) | Tabloya is_deleted sütunu eklemek ve yazılan her SELECT sorgusuna WHERE is_deleted = 0 eklemeyi unutmamak. | keep_deleted => 1 ile silinen kayıtlar ana tablodan kaldırılıp .del arşivine taşınır. Veri sızıntısı riski olmadan güvenle saklanır. |

10. Hızlı Referans ve Kopya Kağıdı (Cheat Sheet)

Günlük kod yazarken başvurabileceğiniz hızlı dönüşüm tablosu:

| SQL İşlemi | AmberDB Metodu | AmberDB Örnek Kullanımı | |---|---|---| | INSERT INTO t VALUES (...) | insert_id | $id = $adb->insert_id("t", 0, @alanlar); | | INSERT INTO t VALUES (...), (...) | insert_list | $adb->insert_list("t", @records); | | SELECT * FROM t WHERE id = ? | read_id | my @rec = $adb->read_id("t", $id); | | SELECT * FROM t WHERE id IN (...) | read_list | my @recs = $adb->read_list("t", $res->{ids}); | | SELECT * FROM t LIMIT 20 OFFSET 0 | read_all | my ($tot, @recs) = $adb->read_all("t", { offset => 0, limit => 20 }); | | UPDATE t SET ... WHERE id = ? | update_id | $adb->update_id("t", @guncel_kayit); | | DELETE FROM t WHERE id = ? | delete_id | $adb->delete_id("t", $id); | | DELETE FROM t WHERE id IN (...) | delete_list | $adb->delete_list("t", @id_list); | | SELECT COUNT(*) FROM t | table_count | my $count = $adb->table_count("t"); | | SELECT * FROM t WHERE col = val | field_fetch | my @recs = $adb->field_fetch("t", $blk, $val); | | SELECT * FROM t WHERE col LIKE '%s%' | search_table | my @recs = $adb->search_table("t", "kelime"); | | SELECT * FROM t WHERE a=? AND b=? | field_filter | $adb->field_filter("t", { filter => { 1 => $a, 2 => $b } }); | | SELECT col, COUNT(*) GROUP BY col | field_fltkeys| $adb->field_fltkeys("t", { target_block => $blk, filter => { $fld => $val } }); | | START TRANSACTION / COMMIT | transact_* | $adb->transact_start(); ... $adb->transact_end(); | | CREATE TABLE / CREATE INDEX | table_attr | $adb->table_attr("t", { match_block => [ 1, 2 ] }); |

11. Kavramlar Sözlüğü (Terminology Glossary)

SQL dünyasındaki kavramların AmberDB mimarisindeki teknik karşılıkları:

| SQL / RDBMS Kavramı | AmberDB Karşılığı | Açıklama ve Mimari Anlamı | |---|---|---| | Database Server / Instance | AmberDB Nesnesi ($adb) | Harici bir daemon veya TCP portu yoktur; uygulama prosesinin içinde gömülü (embedded) bir nesne olarak yaşar. | | Table (Tablo) | Tablo (.db) | Verilerin saklandığı Berkeley DB (DB_File) anahtar-değer dosyası. | | Row / Record (Satır / Kayıt) | Dizi Kaydı (@record) | Sabit kolonlu C-struct benzeri satırlar yerine doğal bir Perl listesidir. Skalar, ARRAY veya HASH referansı taşıyabilir. | | Column / Field (Sütun / Kolon) | Blok / Alan İndisi ($record[$i]) | Kolon adları yerine pozisyonel indisler (1, 2, 3...) kullanılır. | | Primary Key (PK, AUTO_INCREMENT) | 0. İndis ($record[0]) | Her kaydın ilk elemanıdır. Motor tarafından sıralı veya benzersiz sayısal ID atanır. | | Foreign Key & JOINs | İç İçe Dizi (ARRAY ref) & match_block | Normalize edilmiş çoklu tablolar yerine döküman içine gömülü listeler tutulur; .fld tersine indeksleriyle sıfır JOIN maliyetiyle sorgulanır. | | Index (CREATE INDEX) | Şema İndeks Blokları | Tablo şemasında tanımlanan tersine indeksler: Eşleştirme (.fld), Metin arama (.src), Filtre/Facet (.fac), Sıralama (.srt / .inx). | | Query Planner / Optimizer | Doğrudan İndeks Anahtarı Erişimi | SQL sözdizimi ayrıştırma, AST ağacı oluşturma ve maliyet hesaplama yükü yoktur; binary RID blokları doğrudan diskten okunur. | | Collation / Charset | AmberDB::Locale | Harici işletim sistemi veya veritabanı ayarına ihtiyaç duymaksızın Türkçeye ve 10+ dile tam uyumlu yerel alfabe motoru. | | Audit Table & Triggers | log_owner & .aut Dosyası | Kaydı kimin ne zaman eklediğini veya güncellediğini takip eden yerleşik denetim izi mekanizması. | | Soft Delete (is_deleted) | keep_deleted & .del Dosyası | Silinen kayıtların ana tablodan çıkarılıp kurtarılabilir ayrı bir dosyaya taşındığı yerleşik çöp kutusu. | | Harici Önbellek / Oturum Sunucusu (Redis / Memcached Alternatifi) | set_cache / get_cache & RAM-Disk (use_ramdisk) | Harici bir daemon/sunucu kurmaksızın; uygulama düzeyinde L1 süreç içi nesne önbelleği ve kritik/geçici tablolar için işletim sistemi paylaşımlı belleğinde (RAM-Disk) dosya tabanlı, TTL destekli yerel hızlandırma. |