ekrem özer

her yerde olan şeyler.

Couchbase ile İlk Adımlar

Merhaba Arkadaşlar. Bu yazımda sizlere Couchbase ile nasıl başlayabileceğinizi adım adım göstereceğim. .NET geliştiricisi olarak SQL Server tarafına alışkın olabilirsiniz. Ama Couchbase biraz farklı çalışıyor. Özellikle Cluster → Bucket → Scope → Collection yapısı ilk başta kafa karıştırabiliyor. Ben de kendi deneyimlerim üzerinden sıfırdan kurulumdan başlayıp, ilk verimizi ekleyip .NET uygulamasından sorgulamaya kadar göstereceğim. 


1. Kurulum (Windows ve Docker)

1.1 Windows Server Üzerine Kurulum

Öncelikle Couchbase downloads sayfasından Windows için Couchbase Server MSI dosyasını indiriyoruz. Kurulum sihirbazını çalıştırdıktan sonra tarayıcıdan http://localhost:8091 adresine giderek Cluster kurulumu yapıyoruz.

  • Cluster adı belirleyin (ör: DevCluster)
  • Admin kullanıcı oluşturun
  • Servislerden Data, Query, Index, Search seçin
  • RAM kotalarını ayarlayın (ör: Data için 1GB)
# Firewall kuralları (PowerShell)
netsh advfirewall firewall add rule name="Couchbase WebUI" dir=in action=allow protocol=TCP localport=8091-8096
netsh advfirewall firewall add rule name="Couchbase KV" dir=in action=allow protocol=TCP localport=11210

1.2 Docker Üzerinden Kurulum

Eğer Docker kullanıyorsanız tek bir komut yeterli 👇

docker run -d --name couchbase `
  -p 8091-8097:8091-8097 `
  -p 11210-11211:11210-11211 `
  couchbase:community

Ardından yine http://localhost:8091 üzerinden kurulum sihirbazı çıkacak.


2. Cluster, Bucket, Scope ve Collection

Buralar SQL Server geçmişi olanlara tanıdık gelecek:

  • Cluster → SQL Server Instance
  • Bucket → Database
  • Scope → Schema
  • Collection → Table
-- Scope ve collection oluşturma
CREATE SCOPE `Commerce`.`app`;
CREATE COLLECTION `Commerce`.`app`.`users`;
CREATE COLLECTION `Commerce`.`app`.`products`;
CREATE COLLECTION `Commerce`.`app`.`orders`;

3. Index Oluşturma

Sorguların çalışabilmesi için index gerekli. Geliştirme için Primary Index açıyoruz. Performans için ayrıca secondary index’ler tanımlıyoruz.

-- Primary Index
CREATE PRIMARY INDEX ON `Commerce`.`app`.`users`;
CREATE PRIMARY INDEX ON `Commerce`.`app`.`products`;
CREATE PRIMARY INDEX ON `Commerce`.`app`.`orders`;

-- Secondary Index
CREATE INDEX idx_orders_userId
ON `Commerce`.`app`.`orders`(userId);

CREATE INDEX idx_orders_status_createdAt
ON `Commerce`.`app`.`orders`(status, createdAt);

CREATE INDEX idx_orders_items_productId
ON `Commerce`.`app`.`orders`(DISTINCT ARRAY i.productId FOR i IN items END);

4. İlk Verilerimizi Ekleyelim

Couchbase’te otomatik artan ID yok. O yüzden GUID kullanıyoruz. Document key’leri user::GUID, product::GUID şeklinde isimlendirmek en sağlıklı yöntem.

INSERT INTO `Commerce`.`app`.`users` (KEY, VALUE) VALUES
("user::b3f6a8e3-68cb-4f17-b0a8-69c4a8f52290",
{
  "Id": "b3f6a8e3-68cb-4f17-b0a8-69c4a8f52290",
  "Name": "Ekrem Özer",
  "Email": "ekrem@example.com",
  "Age": 36,
  "IsActive": true,
  "CreatedAt": "2025-09-15T19:00:00Z"
});
INSERT INTO `Commerce`.`app`.`products` (KEY, VALUE) VALUES
("product::d52c1f5e-5c44-41c9-9a32-2be6f7a0a9f0",
{
  "Id": "d52c1f5e-5c44-41c9-9a32-2be6f7a0a9f0",
  "Name": "Laptop",
  "Price": 1500,
  "Currency": "USD",
  "Stock": 25,
  "Tags": ["electronics", "computer"],
  "CreatedAt": "2025-09-15T19:05:00Z"
});
-- Çok ürünlü sipariş örneği
INSERT INTO `Commerce`.`app`.`orders` (KEY, VALUE) VALUES
("order::e7d1a3f4-90ad-4b7d-9d57-1a2b3c4d5e6f",
{
  "Id": "e7d1a3f4-90ad-4b7d-9d57-1a2b3c4d5e6f",
  "UserId": "b3f6a8e3-68cb-4f17-b0a8-69c4a8f52290",
  "Items": [
    { "ProductId": "d52c1f5e-5c44-41c9-9a32-2be6f7a0a9f0", "Quantity": 1, "UnitPrice": 1500 },
    { "ProductId": "a8a93f6b-1e1a-4d1d-9c4e-0f5d19d9f0b2", "Quantity": 3, "UnitPrice": 25 }
  ],
  "Total": 1575,
  "Status": "Processing",
  "CreatedAt": "2025-09-16T21:00:00Z"
});

5. İlk SELECT ve JOIN Sorguları

-- Tüm kullanıcılar
SELECT * FROM `Commerce`.`app`.`users`;

-- Orders JOIN Users
SELECT o.Total, o.Status, u.Name, u.Email
FROM `Commerce`.`app`.`orders` o
JOIN `Commerce`.`app`.`users` u
     ON o.UserId = u.Id;
-- Orders → Items (UNNEST) → Products
SELECT META(o).id AS OrderId,
       u.Name     AS UserName,
       p.Name     AS ProductName,
       i.Quantity,
       i.UnitPrice,
       (i.Quantity * i.UnitPrice) AS LineTotal,
       o.Total    AS OrderTotal,
       o.Status
FROM `Commerce`.`app`.`orders` o
JOIN `Commerce`.`app`.`users` u
     ON o.UserId = u.Id
UNNEST o.Items AS i
JOIN `Commerce`.`app`.`products` p
     ON i.ProductId = p.Id;

6. .NET Console Uygulaması

6.1 NuGet Kurulumu

dotnet add package CouchbaseNetClient

6.2 Bağlantı

var cluster = await Cluster.ConnectAsync(
    "couchbase://<sunucu-ip>",
    "Administrator",
    "Parola"
);

var bucket = await cluster.BucketAsync("Commerce");
var scope = bucket.Scope("app");
var users = scope.Collection("users");

6.3 POCO Model

public class User {
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedAt { get; set; }
}

6.4 Insert

var u = new User {
    Id = Guid.NewGuid(),
    Name = "Yeni Kullanıcı",
    Email = "yeni@example.com",
    Age = 29,
    IsActive = true,
    CreatedAt = DateTime.UtcNow
};
await users.UpsertAsync($"user::{u.Id}", u);

6.5 Select (KV Get)

var get = await users.GetAsync($"user::{u.Id}");
var userDoc = get.ContentAs<User>();
Console.WriteLine($"{userDoc.Name} - {userDoc.Email}");

6.6 Select (N1QL Query)

var q = "SELECT u.* FROM `Commerce`.`app`.`users` u WHERE u.IsActive = TRUE";
var qr = await cluster.QueryAsync<User>(q);

await foreach (var row in qr)
    Console.WriteLine($"{row.Name} - {row.Email}");

Sonuç 🎯

Bu yazıda sizlerle Couchbase’i Windows ve Docker üzerinde kurduk, Cluster → Bucket → Scope → Collection hiyerarşisini öğrendik, indexleri ekledik, GUID ID’lerle veriler ekledik ve sorguladık. Son olarak da .NET Console uygulaması üzerinden hem Insert hem de Select işlemlerini gerçekleştirdik. 🎉

Bir sonraki yazımda Couchbase tarafında Index optimizasyonu ve performans best practices konularına değineceğim. Takipte kalın 👋