Forum

alışveriş sepeti ve...
 
Bildirimler
Hepsini Temizle

alışveriş sepeti veritabanı tasarımı

12 Yazılar
2 Üyeler
0 Likes
6,911 Görüntüleme
(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

Merhaba arkadaşlar benim alışveriş sepeti veritabanı tasarımı hakkında kafama takılan bazı sorular var onları size danışmak istiyorum. veritabanlarını incelediğimde cartid diye bi alan var bu alan neden vardır? kısaca basit olarak anlatabilecek bi arkadaş var mı? Mesela 1 kullanıcı sepeti 2 kere doldurup ödeme yaptı ayrı ayrı sepet alışverişi olarak mı bunları tutmak gerekiyor yardımcı olursanız sevinirim

 
Gönderildi : 04/02/2016 19:14

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

Burada cartid ile kasdedilen, sipariş ID (order ID).  Yani bir kullanıcının yapmakta olduğu bir alışverişte (ya da başka bir deyimle, vermekte olduğu siparişte), siparişindeki bir ya da daha fazla ürünleri içeriyor.  Sepet ID eşittir Sipariş ID.  Bir müşteri herhangi bir anda en fazla bir sipariş veriyor olabilir.  Aynı gün içinde birden fazla sipariş verebilir ancak bir sipariş tamamlanmadan yeni bir siparişe geçemez.

Bir kullanıcı bir oturum (session) sırasında birden fazla sepete sahip olamaz.  Ancak bir siparişin ödemesi tamamlanır ise yeni bir siparişe (yeni bir sepete) geçilebilir.  Bu durum hem tarayıcı içinde hem de sunucu tarafında önlenir.

Bir kullanıcı aynı anda birden fazla oturum açamaz (örneğin farklı tarayıcılar kullanarak).  Bu durum sunucu tarafında önlenir.

Kullanıcı siteye giriş (login) yapmış ise kullanıcının bilinen müşteri numarası sepet ve sepetteki ürünler ile eşleştirilir.  Eğer kullanıcı henüz giriş yapmamışsa, müşteri numarası (örnek) -1 olarak kullanılır.  Fakat giriş yapmamış kullanıcılar için bile bir tarayıcı oturumunda en fazla bir sepet bulunur.

Sipariş ID (Aktif sipariş) - Müşteri ID ilişkisi: 1 : 1 (Herhangi bir anda)

Sipariş ID (Tamamlanmış eski sipariş) - Müşteri ID ilişkisi: Ç : 1 (Ç = Çok)

Sipariş ID - Ürün ID ilişkisi: 1 : Ç

Ayrıca ürün sınıfları için bir tablo, promosyonlar için (hepsiburada'nın hediye çekleri gibi) bir tablo ve ürün açıklamaları için bir tablo bulunur (fiyat da dahil olmak üzere).

 
Gönderildi : 04/02/2016 20:34

(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

cevap için çok teşekkür ederim. peki siparişid alanı neye göre ve nerde oluşturuluyor? 

 

Siparişler Tablosu

---------------------------------------

siparişid müşteriid urunid   durumu

1               1            1       ödeme bekliyor

1               1            2       ödeme bekliyor

2               2            1       ödendi

2               2            2       ödendi

 

örnek tabloda 1 nolu kullanıcı 1 ve 2 nolu ürünleri sipariş tablosuna eklemiş ve ödememiş, 2 nolu müşteri ise 1 ve 2 nolu ürünleri eklemiş ve ödemiş. bunları ödediğinde yeni siparişid mi oluşacak takıldığım nokta burası sipariş id neye göre oluşacak?

 
Gönderildi : 04/02/2016 21:53

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

Sipariş_ID sistemde benzersiz olursa, avantajı şu olur: bir müşteri temsilcisine Sipariş_ID verilince, müşteri numarasına gerek olmadan siparişin detayları veritabanından çekilebilir.

Şu andaki durum şöyle:

1 numaralı müşteri 1 numaralı siparişi vermiş.  İki ürün almış: 1 ve 2 numaralı ürünler.  Ödemeyi yapmamış.

2 numaralı müşteri 2 numaralı siparişi vermiş.  İki ürün almış: 1 ve 2 numaralı ürünler.  Ödemeyi yapmış.

Şimdi diyelim ki 2 numaralı müşteri yeni bir sipariş verecek.  Yeni sipariş verebilir çünkü açık (ödemesi yapılmamış) siparişi yok.  Yeni siparişin Sipariş_ID'si, sırada kullanılacak olan bir sonraki numaradır, yani: 3.

2 numaralı müşteri 3 numaralı siparişi veriyor.  Bir ürün alıyor: 1 numaralı ürün.  Ödeme yapmıyor (sipariş açık).

Bu sırada yeni bir müşteri geliyor (42 numaralı müşteri).  Siteye giriş yapıyor.  Sepetini doldurmaya başlıyor.  Sistem tarafından yeni bir Sipariş_ID üretiliyor: sırada kullanılacak olan bir sonraki sipariş numarası: 4.

42 numaralı müşteri 4 numaralı siparişi veriyor.  Şimdilik bir ürün alıyor: 8 numaralı ürün.

1 numaralı müşteri henüz ödeme yapmadığı için yeni bir sipariş başlatamaz.  Eğer yeni bir ürün seçerse, bu ürün varolan siparişine (1 numaralı siparişe) eklenir.

Yukardaki gelişmelere göre tablonuzu güncelleyip buraya yazın, kontrol edeyim.

Ayrıca şunu da akılda tutmak gerek: Eğer müşteri siparişi açık bırakıp unutur ve siteye geri dönmez ise, o siparişin zaman aşımına uğraması gerekir.  Aksi takdirde, müşteri siteye 2 hafta sonra uğrarsa, sepetine koyduğu ürünler stoktan tükenmiş, ya da ürünlerin fiyatı değişmiş olabilir.  En basitinden, almayı planladığı aynı ürünü daha önceden sepetine koyduğunu unutmuş olur, ürünü tekrar sepete koyunca, sistem aynı üründen iki tane almak istediğini varsayar, ve sonu iyi bitmeyecek bir karmaşa yaşanabilir ("Bana niye iki tane ürün yolladınız?").  Bu nedenle makul bir süre sonra (örneğin 24 saat) açık siparişlerin zaman aşımına uğraması en iyi ticari yöntem olur.

Bazı modern siteler, sepete ek olarak "daha sonrası için sakla" seçeneği veriyorlar (örneğin idefıx.com).  Böylece müşteriler uzun vadede almayı planladıkları ürünleri saklayabiliyorlar.

Bazı başarısız siteler ise saklanan ürünleri bile birkaç gün gibi kısa bir süre sonra haber vermeden siliyorlar (gittigidiyor.com'un hiçbir zaman doğru dürüst çalışmayan "izlemeye al" özelliği gibi).

 

 

 

 

 
Gönderildi : 04/02/2016 23:03

(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

şuan gayet açıklayıcı oldu teşekkürler. O zaman şu durumda herhangi bir müşteri sepetine bir ürün eklemek istediğinde siparisler tablosundan müşterinin açık siparişi varmı kontrol edeceğim  eğer açık sipariş varsa açık olan sipariş numarasını veritabanından çekip eklemek istediği ürünü çektiğim siparisid ile kaydedeceğim. eğer açık siparişi görünmüyor ise yok ise yeni bir siparisid üretip o siparisid ile sipariş durumu açık olarak kayıt edeceğim. Doğru anlamışmıyım acaba? Sepeti boşalt dediğinde nasıl bir yol izlemeliyim

 
Gönderildi : 04/02/2016 23:28

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

> herhangi bir müşteri sepetine bir ürün eklemek istediğinde siparisler tablosundan müşterinin açık siparişi varmı kontrol edeceğim  

> eğer açık sipariş varsa açık olan sipariş numarasını veritabanından çekip eklemek istediği ürünü çektiğim siparisid ile kaydedeceğim.

Doğru.  (Sipariş zaman aşımı uygulaması daha sonraya bırakılabilir.)

 

> eğer açık siparişi görünmüyor ise yok ise yeni bir siparisid üretip o siparisid ile sipariş durumu açık olarak kayıt edeceğim.

Evet.  Siparişler tablosunun anahtarı siparisid olacak.  Veritabanı yeni bir kayıt yaratınca zaten otomatik olarak yeni bir siparisid oluşturulacaktır.

Bu tablo sipariş ile ilgili bilgileri içermeli (tarih ve saat, siparişi veren müşterinin numarası, vb) fakat ürünler bu tabloda tutulmamalı.  Ürünler farklı bir tabloya, Siparişürünleri tablosuna girilmeli.  O tablonun bileşik anahtarı müşteriid + siparisid olmalı.  (Nedeni aşağıda.)

 

> Sepeti boşalt dediğinde nasıl bir yol izlemeliyim?

Müşterinin açık siparişi var mı? Var.

Açık siparişin numarası ve Müşteri numarasını kullanarak Siparişürünleri tablosunu sorgula.  Eğer kayıt var ise, kayıtları sil.

Kayıt yok ise, zaten müşteri henüz sepetine ürün koymamış demektir.

 
Gönderildi : 04/02/2016 23:57

(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

Yeni bir müşteri sepete ürün eklediğinde, siparisler listesinde siparisi olmadığı için bir sipariş kaydı oluşturulacak. Oluşturulan siparis kaydında oluşan siparisid değeri ürün eklerken kullanılacak. Müşteri ödeme yapana kadar sepetnumarası bu id olacak. ne zaman ödeme yaptı o zaman siparisler tablosundan ilgili siparisid durumu kapalıya döndürülecek. Müşteri sepete ekle derse kapalı olduğu için yeni bir siparisid oluşacak ve yeni siparis id ile ürünler eklenmeye başlayacak? doğrumudur hocam sanırım anladım Allah razı olsun sizden

 
Gönderildi : 05/02/2016 00:42

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

> Yeni bir müşteri sepete ürün eklediğinde, siparisler listesinde siparisi olmadığı için bir sipariş kaydı oluşturulacak.

Siparişler listesi -> Siparişler tablosu

> Oluşturulan siparis kaydında oluşan siparisid değeri ürün eklerken kullanılacak.

Evet.  Ayrıca ürün eklenirken müşteriid de kullanılacak.

> Müşteri ödeme yapana kadar sepetnumarası bu id olacak.

Evet.

> ne zaman ödeme yaptı o zaman siparisler tablosundan ilgili siparisid durumu kapalıya döndürülecek.

Evet.

> Müşteri sepete ekle derse kapalı olduğu için yeni bir siparisid oluşacak ve yeni siparis id ile ürünler eklenmeye başlayacak?

Evet fakat müşterinin bir sürü kapalı (yani geçmişte tamamlanmış/ödenmiş) siparişi olabilir.  O nedenle "müşterinin siparişi kapalı mı?" şeklinde bir sorgulama yapamayız.  Tersine, "müşterinin tek bir açık siparişi var mı?" şeklinde bir sorgulama yapabiliriz.  Bunun sonucu da evet ya da hayır (null kayıt) olabilir.  Kayıt yoksa (null kayıt), yeni sipariş açarız.

Not: Programlamaya geçmeden önce kullanacağınız tüm tabloları ve tabloların alanlarını, tablolar arasındaki ilişkiyi mutlaka resme dökmeniz gerekli.  Buna data model denir.  Örnek:

 

Not: Yukardaki örnek bizim tartıştığımız tasarımdan farklı.

 
Gönderildi : 05/02/2016 02:01

(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

hocam son bir sorum daha olacak. Kayıtlı olmayan müşteriler için nasıl bir yol izlemeliyim? misafirler için ayrı bir sipariş tablosumu açmalıyım? kayıt olursa kayıtlılar tarafına mı taşıyım

 
Gönderildi : 07/02/2016 01:51

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

Kayıtlı olmayan misafirlere normal müşteri gibi davranılacak, ama müşteri numarası için -1 kullanılacak.

Misafir müşteri olarak kayıt olduğu zaman siparişdeki müşteri numarası güncellenecek ve -1 yerine gerçek müşteri numarası doldurulacak.

Sonra müşterinin ödeme yapması beklenecek.

Belli bir süre sonra (örneğin 24 saat) müşteri ödeme yapmaz ise, sipariş çöpe atılacak.  Bu çöp toplama (garbage collection) işi her gün belli saatte çalışan bir batch/cron işi ile yapılabilir.

Ayrı bir sipariş tablosu açmaya gerek yok.  Eğer misafir kayıt olmazsa, ziyan olan tek şey, kullanılmak üzere ayrılmış olan sipariş numarası olur.  Bu kullanılmayan numaralar da geri dönüşüme tabi tutulabilir (recycle edilebilir) ama bence gerek yok.

 
Gönderildi : 07/02/2016 02:08

(@erenbalta)
Gönderiler: 170
Reputable Member
Konu başlatıcı
 

peki musterileri nasıl ayırdedeceğiz? herkesin müşteri numarası -1

 
Gönderildi : 07/02/2016 02:22

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
 

> peki musterileri nasıl ayırdedeceğiz? herkesin müşteri numarası -1

Eğer müşteri numaraları -1 ise henüz müşteri değiller, misafir statüsündeler.  Kayıt olunca müşteri olacaklar. 

Diyelim ki iki farklı misafir farklı IP'lerden ya da aynı IP fakat farklı tarayıcılardan siteye bağlanıp aynı anda sepet dolduruyorlar.

Sepetlerin anahtarları (yani sipariş ID'ler) farklı olacaktır çünkü her bir misafir için farklı oturum açılmış olacaktır.  Böylece sepetlerdeki ürünler karışmayacaktır.

Yani sipariş ID'si dışında misafirleri ayrı ayrı takip etmeye gerek yok, çünkü henüz müşteri değiller.

Anlaşıldı mı?

 
Gönderildi : 07/02/2016 13:47

Paylaş: