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 )