Database - Veritabanı
Farklı Para Birimlerine Ait Fiyat Bilgisinin Sıralanması [DB]
Farklı Para Birimlerine Ait Fiyat Bilgisinin Sıralanması [DB]
-
Yine hem ayranımızın dökülmeden hemde tatsız olaylar yaşanmadan çözülmesi gereken bir sorun ile karşınızdayım.
E-Ticaret sitesinde ürünlerin fiyatlarının farklı para birimleri ile kayıt edilmesi gerekiyor. Örneğin A ürünün fiyatı 10 EUR, B ürünün fiyatı 50 TRY gibi. Bu şekilde baktığımızda ürün tablosuna "currency" adında bir kolon tanımlayarak ve buraya EUR, TRY, USD gibi döviz cinsini ekleterek çözebiliyoruz görünüyor. Ancak işler fiyata göre sıralama kısmında karışıyor. Ürünleri kullanıcının seçtiği yada sistem tarafından varsayılan para birimine göre sıralama yapmaya kalktığımızda (fiyata göre artan-azalan) işler sarpa sarıyor. Şöyleki normal şartlarda sorguda "order by" bölümünde hesaplama yaptırıp (price*currency_ratio (10 x 7.9)) bu şekilde sıralama yaptırabiliyoruz. Ancak bu şekilde sıralama yaptığımızda veritabanı (mysql) fiyat kolonu indexini kullanamıyor ve temporary bir tablo oluşturup buraya alıp burada sıralama yapıyor ve buda ciddi performans kaybına sebep ve kaynak kullanımına sebep oluyor.
Aklıma farklı farklı şeyler geliyor ancak her biri farklı yerlerden sorun teşkil ediyor ve içime sinen bir çözüm bulamadım. Siz olsanız bu durumda nasıl bir geliştirme yapardınız?
*Ek: Diğer açık kaynak e-ticaret projelerini inceledim gördüğüm kadarıyla hepsi default platform para birimi ile ürün kaydı yaptırıyor, daha sonra görüntüleme kısmında seçilen para birimine göre fiyatları hesaplayıp gösteriyor. Ben bu şekilde yapamıyorum çünkü farklı entegrasyonlardan gelen ürünler var bunlar farklı para birimleri ile geliyor.
*Not:
DB: MySQL
Dil: PHP
Framework: Laravel
TeRRoR tarafından 25/Eyl/20 09:35 tarihinde düzenlenmiştir -
aklıma gelen ilk çözümü söyliyim belki fikir verir hocam;
yeni bir kolon aç ve burada tek bir para biriminden tut değerleri sıralamayı da bu kolona göre yap 50 EUR 400 tl şeklinde bu kolonu sıralayıp normal fiyatını gösterdiğinde hız anlamında ciddi kolaylık yaşarsın gibi geldi bana
-
SettingZ bunu yazdı
aklıma gelen ilk çözümü söyliyim belki fikir verir hocam;
yeni bir kolon aç ve burada tek bir para biriminden tut değerleri sıralamayı da bu kolona göre yap 50 EUR 400 tl şeklinde bu kolonu sıralayıp normal fiyatını gösterdiğinde hız anlamında ciddi kolaylık yaşarsın gibi geldi bana
Hocam öncellikle fikrin için teşekkürler. Bahsettiğin şekilde platform'un döviz cinsine göre ayrı bir kolonda kayıt tuttuğumda döviz kuru değiştiğinde tüm kayıtlarda bu kolonları güncellemem gerekiyor. Şuanda 500k kayıt var ve artıyor-artacak. 500k kaydı topluca güncellemekten çekiniyorum açıkçası :/
-
Tüm fiyatları sabit bir para birimine göre girişini yap daha sonra merkez bankası kuru veya el ile girdiğiniz kura göre ekrana yazdırabilirsiniz diye düşünüyorum. Örn. A ürünü 50 $, B ürünü değeri 70 TL. Siz ikisinide Dolar kuru üzerinden db kaydedeceksiniz daha sonra ürünün görüntülenecek para birimini seçeceksiniz. Bu size performans tarafında yardımcı olacaktır. En basit ve kolay yol olarak aklıma bu geldi hocam.
-
Currency model/tablosunda para birimlerini tutardım.
ExchangeRate model/tablosunda günlük çalışıp güncel kurları tutardım.
Eğer sabit sayıda para birimi olacaksa Product tablosunda accessor ile para birimlerinin çevirisini yapıp appends ederdim.
Para birimi çoğalma durumu varsa model içinde istediğim para birimine convert edecek bir method yazardım.
Sonrasında ise orderBy yaparak para birimine göre sıralatırdım.
-
farklı para birimi ile gelenleri de şöyle yap. bir lira kolonu olsun. Mesela a ürünü 5 euro, onu dbye lira = 5 * 9 diye ekle. b ürünü 6 dolar, onu dbye lira = 6 * 8 olarak ekle. Aslında tüm ürünlerini varsayılan olarak lira karşılığı olarak ekle. Dünyadaki para birimlerinin birbirine karşı değerleri çok değişmediği için (bizimki hariç) döviz kuru değişse bile sıralamada çok fazla bir değişiklik olacağını düşünmüyorum.
-
döviz kuru dakka başı değişen bir şey değil (değişse bile sıralamanı etkileyecek kadar değişmez) , yaz bir cron 30dk da bir ürünlerin fiyatını baz olarak kabul ettiğin kura göre hesaplayıp yazsın bi kolona. sonra o kolona göre sıralarsın.
-
Bence en mantıklısı; varsayılan olarak bir parabirimi seçip bir kolonda o cinsten tutup ona göre sıralama yapılabilir. TL karşılığını bir kolonda tut, saatlik cron ile güncelle. sıralamayı TL kolona göre yap, gösterirken dolar fiyatını göster.
---
Diğer bir yöntem; sıralama yapınca tüm para birimlerinde grup grup sıralansa? Mesela fiyata göre sıralama yapınca en başta tl olanları küçükten büyüye, sonra usd olanları küçükten büyüğe sıralasa?
----
Woocommerce gibi hazır sistemler nasıl hallediyor acaba bu sorunu?
-
Herkese teşekkürler. Fiyat kolonunu varsayılan para biriminde tutup ekstra kolonda doviz halini tutup ayrıca ürünü doviz birimi ile ilişkilendirdim. Belirli aralıklarla cron job ile döviz*kur ile fiyat kolonunu güncellicem. Umarım yarın bir gün UPDATE 2 gün sürüyor nasıl optimize ederiz diye konu açmam.
-
TeRRoR bunu yazdı
Herkese teşekkürler. Fiyat kolonunu varsayılan para biriminde tutup ekstra kolonda doviz halini tutup ayrıca ürünü doviz birimi ile ilişkilendirdim. Belirli aralıklarla cron job ile döviz*kur ile fiyat kolonunu güncellicem. Umarım yarın bir gün UPDATE 2 gün sürüyor nasıl optimize ederiz diye konu açmam.
şimdiden stored procedure ile update et hacı. ya da direkt kura göre where yap
"update table set `tl_karsilik` = doviz_fiyat*7.75where `doviz` = 'USD'"
-
yolbulucu bunu yazdıTeRRoR bunu yazdı
Herkese teşekkürler. Fiyat kolonunu varsayılan para biriminde tutup ekstra kolonda doviz halini tutup ayrıca ürünü doviz birimi ile ilişkilendirdim. Belirli aralıklarla cron job ile döviz*kur ile fiyat kolonunu güncellicem. Umarım yarın bir gün UPDATE 2 gün sürüyor nasıl optimize ederiz diye konu açmam.
şimdiden stored procedure ile update et hacı. ya da direkt kura göre where yap
"update table set `tl_karsilik` = doviz_fiyat*7.75where `doviz` = 'USD'"
hocam store procedure önermenin özel bir sebebi varmı?