AmberDB

 view release on metacpan or  search on metacpan

docs/TR.AmberDB-vs-SQL_Kullanim_Rehberi.md  view on Meta::CPAN

  my @records = $adb->read_list("products", $res->{ids}); 
  ```

* **Açıklama:** `field_filter`, birden fazla alanın eşleşme indekslerini binary küme kesişimi (set intersection) ile birleştirir.
* **Referans:** [Tutorial Bölüm 4.3: field_filter](TR.AmberDB_Veritabani_Sistemi.html#43-gelişmiş-arama-ve-dinamik-kombinasyonlar-field_filter)

---

### 3.5 Sayfalama (LIMIT & OFFSET)

* **SQL:**
  ```sql
  SELECT * FROM products
  ORDER BY id DESC
  LIMIT 20 OFFSET 40;
  ```

* **AmberDB:**
  ```perl
  # Parametreler: tablo, \%secenekler (offset, limit, sort)
  my ($total, @page) = $adb->read_all("products", { offset => 40, limit => 20, sort => { reverse => 1 } });
  print "Toplam $total kayıttan 40-60 arası gösteriliyor:\n";
  ```

* **Açıklama:** `read_all` metodu veritabanının kayıt ID dizisi üzerinde doğrudan ikili arama ve dilimleme yapar. SQLite ve MySQL'in yüksek offset değerlerinde yaşadığı derin sayfalama yavaşlığını yaşamaz.
* **Referans:** [Tutorial Bölüm 4.1: read_all](TR.AmberDB_Veritabani_Sistemi.html#41-toplu-ve-sıralı-okuma)

---

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

### 4.1 Sayısal ve Alfabetik Sıralama

* **SQL:**
  ```sql
  SELECT * FROM products
  WHERE category_id = 5
  ORDER BY price ASC;
  ```

* **AmberDB:**
  ```perl
  # field_fetch içinde dinamik sıralama:
  # tabloid, blok_indis, blok_deÄŸeri, \%secenekler
  my ($total, @sorted) = $adb->field_fetch(
      "products", 4, 5,
      { offset => 0, limit => 20, sort => { blk => 2, reverse => 0 } } # Blok 2 (fiyat) artan
  );
  ```

* **Açıklama:** Tablo şemasında `sort_block => [2]` tanımlanmışsa, motor `.srt` indeksini kullanarak ekstra bellek sıralaması yapmadan veriyi doğrudan sıralı getirir.
* **Referans:** [Tutorial Bölüm 6.4: Sıralama İndeksleri (.srt)](TR.AmberDB_Veritabani_Sistemi.html#64-sıralama-indeksleri-srt)

---

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

* **SQL:**
  ```sql
  SELECT * FROM members
  ORDER BY name COLLATE utf8mb4_turkish_ci;
  ```

* **AmberDB:**
  ```perl
  # Nesne başlatılırken belirtilen dil motoru otomatik çalışır:
  # cfg => { language => 'tr' }
  my ($total, @members) = $adb->read_all("members", { offset => 0, limit => 50, sort => { blk => 1 } });
  ```

* **Açıklama:** AmberDB, harici veritabanı collation paketlerine veya iÅŸletim sistemi yereline bağımlı olmadan kendi bünyesindeki `AmberDB::Locale` motorunu çalıştırır. Türkçe `Ç, Äž, I, İ, Ö, Åž, Ü` harfleri ASCII karmaÅŸasına uÄ...
* **Referans:** [AmberDB::Locale Rehberi](TR.AmberDB-Locale_Kullanim_Rehberi.html)

---

## 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:

```sql
-- 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:

```perl
# 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:
```perl
{
    match_block => [ 3 ], # Blok 3 içindeki tüm alt dizi elemanlarını otomatik indeksle



( run in 0.524 second using v1.01-cache-2.11-cpan-364913b4093 )