v2.5.2
Giriş yap

Veritabanı Tasarım Önerisi?

munlu
1,070 defa görüntülendi

Merhaba arkadaşlar, öncelikle şuan hali hazırda güzellik salonum için bir satış takip sistemi yaptım.
Fakat benim yapmak istediğim daha detaylı bir durum çünkü şuan ki sistemde artık çok fazla aksaklık olmaya başladı ve sistem sıkıntı vermeye başladı.


Sistem Gereksinimleri

  • Müşteriler kendi panelinden satın aldıkları hizmetleri, kimden satın aldıklarını, satın aldıkları ürünlerin kaç taksitinin kaldığını. Hangi taksitleri ödeyip ödemediğini ve sistem üzerinden iyzico sanal pos sayesinde kredi kartı ile ödeme ve randevu oluşturma yapabilecekler.
  • Satış danışmanı üye kayıt, satış ekleme-çıkarma, ödeme takip(ekleme-çıkarma) yapabilecekler.
  • Yönetici hizmet ekleme-çıkarma, satış danışmanı ekleme-çıkarma, mali kayıtları görme, site istatistiklerini görme ve diğer tüm işlemleri yapabilecekler.
  • Ödeme takip kısmı ücretini ödemeyen müşterilere uyarı mesajı gitmesi - sistemde ödeme yapmayan üyeleri detaylı bir şekilde işlemlerine kadar gösterme.

Güncellenmiş sistem gereksinimleri tamamen bu şekildedir. Web ve Mobil üzerinden uygulamayı geliştireceğim için veritabanı tasarımı aşırı önemli. Çünkü satış işlemlerinde taksit seçeneği var ve ödemeleri şuan elle nakit şekilde alıyoruz. O yüzden sistemde nakit ve kredi kartı girdisi mevcut.

Benim tasarladığım veritabanı aşağıda ki şekildedir. Ödemeler toplasında satışta belirlenen taksit tutarı kadar o satiş id sine ait ödemelerin girdisi oluyor. Bu yüzden satış kısmında birden çok hatayla karşılaşabiliyorum. Sitede ki konularımdan bakabilirsiniz.

Ayrıyetten kapora muhabbeti de sistemde mevcuttur. Kayıt olan müşteri kapora verdiyse genel satıştan düşüp taksitlendirme yapılmaktadır.


Dükkan Tablosu

Müşteri Tablosu

Ödemeler Tablosu

Satışlar Tablosu

Ödeme Takip Tablosu

Ürünler Tablosu

Yönetim Tablosu


Birçok hatam olabilir siz değerli bilgili arkadaşlarımdan, abilerimden öğütler ve örnekler bekliyorum. Bende bu doğrultuda hatalarımı düzeltim daha sistematik bir uygulama geliştirmek istiyorum.

Sisteme kayıt alırken şu yöntemle şu verileri kayıt et gibi önerilerinize de açığım cevap veren, vermeyen herkese şimdiden teşekkür ederim.

Cevap yaz
Cevaplar (5)
mutluol
1704 gün önce

siparişler
id, urun_id, musteri_id hizmet, fiyat, taksit, odemeyontemi, kapora, durum(ödemin bitip bitmediğini kontrol edecek), tarih(timestamp current), detay,

ödemeler
id, siparis_id, musteri_id, hizmet, satici, tarih(taksitin ödenmesi gereken tarih), tarih2(odemin yapıldığı tarih), odemeyontemi, ödeme, taksit, durum, notlar

müşteriler
musteriler, isim, soyisim, telefon vs.

sipariş kolonlarda gözüken yapıya uygun şekilde girilir.

siparişler tablosondaki sipariş id ile durum baz alınarak ödemeler sayfasında sorgu yapılır

ödenmemiş hizmetler listelenir

belli bir müşteriye ait ödenmemiş bilgileri listelemek için sorguya musteri id eklenebilir

tüm ödenmemişleri görüntülemek için durum baz alınarak listeleme yapılabilir
güncelleme kısmında muhtemelen olumsuz durumlarda kullanacağı için, notlar kullanılarak neden güncellendiği bilgisi kayıt edilir bu alanı text yapıp bir tinymce eklentisini form alanında kullanırsan şaşırtıcı derecede verimli olur senin için

ödeme alma gelirsek, insert için çekilen veriler form alanlarında gerekli koşula uygun hazırlanır örneğin <input type="hidden" name=siparis_id value="<php? echo row['siparis_id']; ?>"> (bu form olmadan da yapılabilir, basite indirgemek için form ekledim) ödeme tutarı muhtemelen manuel girileceği için bir form verisi girilir daha sonra mevcut taksit durumu +1 arttırılır ya da tam taksit verildiyse -1 düşürülür bu nasıl kolayınıza geliyorsa ve ödemeler tablosuna yeni bir kayıt eklenir

bu mantığa görede takistler 8 ile başlıyorsa ödemelerde 8 den 1 düşülür ya da 0 dan başlar 1 1 artar 8 olana kadar, ödeme hesaplamasınıda fiyat/taksit olarak tutacağını varsaydık tabiki 1000/5 ise her taksit 200 olacaktır vesaire burada veritabanının önemi kadar onu nasıl kullanacağın da önemli. bir önceki mesajımda tamamen matematiksel işlemler üzerinden tek tabloda 3 kolona bazı değişiklikler uygularak en basit haliyle kendimce bir şeyler anlatmaya çalışmıştım. yani veritabanı kadar, php tarafında da iyileştirmeler yapmanız gerekiyor.

munlu
1705 gün önce

@mutluol öncelikle anlışan fiyat ürün seçilerek satış ekleniyor hocam. diyelim 1500 tl ye lazer epilasyon için anlaştık müşteri 8 taksit elden ödücem dedi.
100 tl de kapora verdi.

ben bu 1500 - 100 yapıyorum 1400 tl yi de 8 e bölecek döngü komutuyla ödemeler tablosuna ekliyorum.
sipariş tablosunda ne satıldığı vs bilgileri var görselden de anlayacağınız gibi böyle kayıt ettirmem nedense bazen sistemde sıkıntı çıkarıyor eklendi gözüküp eklenmiyor vs bir ton sorun çıkıyor.

O yüzden temiz bir arayüz ile daha işlevsel bir veritabanı tasarlayıp girişleri öyle yapmak istiyorum. İstediğim özellikleride sistem gereksinimlerinde anlattım.
Bu tip bir isteği karşıyalacak en mantıklı ilişkisel tablo yapısı nasıl olur diye de size soruyorum.
Ek olarak verileri sisteme şöyle kaydedersen daha sağlıklı olur gibisinden de önerilerinize açığım. Takip tablosu tamamen ödeme yapmayan müşterileri takip edebilmek için oluşturdum. Bunu ortadan kaldırmak istiyorum mesela nasıl bir yöntem daha faydalı olur?

Şuan nakit veya kartlı işlemelemleri elden alıyoruz. Sanal pos entegrasyonunu yaptığımda kredi kartı işlemlerinde online alabileceğim.

mutluol
1705 gün önce

tablo gayet işlevsel gözüküyor. bir tabloya bakıp gerçekleşecek işlemlerin tamamını kafamda canlandıramadığımdan bir önerim yok. dükkan ile takip gereksiz gibi duruyor, dükkanı zaten ne işe yaradığını da anlamadım. takip tablosuna gelirsek, ikincil değerin müşteri id olduğunu görüyorum, burada her müşteri için bir kez takip olayı gerçekleşecek ise müşteri tablosu ile birleştirmen daha mantıklı. hayır bir müşteriye birden fazla takip uyguluyoruz diyorsan, bu şekilde olabilir.

taksit sorusunu hiç anlamadım. paytr ile çalışıyorum ben, ödeme ve taksitlerden onlar sorumlu, komisyon alıyorlar sadece. siz kredi kartına yaptığınız taksitleri online değilde elden mi alıyorsunuz, elden alıyorsanız 3 taksit yapıldığında 3 kere iş yerinize gelip tek tek mi ödüyor taksitleri anlamadım ki.

elden ve kartsız işlemlerde taksit girdisi için sipariş tablosu şöyle olabilir fiyat, taksit, ödenen,

ürün fiyatı sabit olduğu için, değeri ürün tablosundan alıyorsun zaten. sipariş oluşturulur taksit tutarı belirtilir, ilk ödeme kaydedilir

fiyat 1500, taksit 3, ödeme yok diyelim
$taksitler = explode(",", $taksit); // taksitler 3,0 şeklinde kayıt edilir, 3 taksit tutarı virgülden sonrası kalan taksit için hesaplama değeri
$taksittutari = ($fiyat / $taksitler[0]); //taksit için ne kadar ödeceğini verir
$kalanodeme = ($fiyat - $odenen); //kalan borcu verir
$yeniodeme = ($odenen + $odeme); //yeni ödeme esnasında, yapılan ödeme miktarını mevcut ödenen tutara ekleyerek yeni bir ödenen miktarı oluşturur örneğin 150 verdi 150 daha verdi 300 odenen oldu veritabanını güncelledin bu değer ile
$kalantaksit = ($taksitler[0] - $taksitler[1]);
$kalantaksitguncelle = ($taksit + 0.1);
bu değişkenleri oluşturduktan sonra veriyi istenilen formatta ekrana basabilir ve $kalantaksitguncelle, $yeniodeme değişkenleriyle veritabanında gerekli yerleri güncelleyerek girdi oluşturabilirsin

formülü üretcem diye baya vakit harcadım ya. veritabanıda "detayda belirttiğin gibi satıştaki tasit sayasına göre girdi" oluşturmayı en kısa böyle yapabilirsin ne avatajı oldu 100 sipariş için 12 taksit uygulasanız fazladan 1 tablo ve içerisinde 1200 değer olacaktı bundan kurtuldunuz

  1. taksitte ne kadar ödendi hangi tarihte ödendi gibi bilgileri ayırmak istiyorsanda oda farklı bir konu sonuçta detayda taksit sayısına göre ayrı ayrı girdi oluşturmak istiyorum dememişsiniz.
munlu
1705 gün önce

Öncelikle cevap verdiğiniz için teşekkür ederim ödemeler tablosunda detayda da belirttiğim gibi satıştaki taksit sayısına göre girdi oluşturuyorum bu olayın daha basit bir yapılımı var mı?
Onun harici yapmak istediğim sistemi anlattım bununla ilgili nasıl bir tablo yapısı kursam daha profesyonel ve işlevsel olur diye soruyorum.

mutluol
1705 gün önce

az çok bir şeyler canlanıyor insanın kafasında tablolara bakınca ama, siz kendi ihtiyacınıza uygun yaptığınız ve kendi anlayacağınız şekilde isimlendirdiğinizden, ilk bakışta sizin kadar tablo ve kolonları birbirleriyle sizin kadar iyi kurgulayamayız.

öncelikle int değerleri 11 karakter olmaz. int eksi ve + milyar değerine kadar sayı tutar bu da 10 karaktere denk gelir ve sayısal değerler tamsayıdır. örneğin bir telefon numarasını başında 0 ile post ettiğinizde, veritabanına farklı bir değer kaydeder. 0 olmadan post ettiğinizde telefon numarasını normal kaydeder. bu yüzden önce veri türünüzü doğru seçin. int 11 diye bir şey yok kısacası.

tarih verilerinide timestamp olarak vermenizi öneririm, ayrıca varsayılanı current yaparsanız daha az kod yazarsınız geçerli zamana ait tarihi kaydedeceği için. bu tarz sistemlerde tarih tek başına yeterli değildir, bazen saate de ihtiyac duyarsınız date ile saat kaydedemezsiniz. curent kullanımında php tarafında işlemin gerçekleşeceği sayfada zaman dilimi belirtmez iseniz, bilgisayarın tarih ve saatini alır. bilgisayarın tarih ve saati hatalıysa, girdi de hatalı olur.

yapıya gelirsek, o konuda bi tavsiye veremiyorum, kalın kafalıyım galiba biraz geç anlıyorum : ) ama soracağınız bir şeyi daha detaylı açıklarsanız, anladığım kadarıyla bildiğimde bir şey varsa yardımcı olmaya çalışırım.