lostyazilim
tr.link

Aynı anda 10 veri tabanına bağlanıp, içiçe veri çekmek...

22 Mesajlar 2.347 Okunma
lstbozum
tr.link

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)

Qezgin adlı üyeden alıntı

Öncelikle Merhabalar,

@EmirKutlu'nun dediği yol en mantıklısı gibi duruyor.

Bunu php json ile yapabilirsin oldukcada kolay olur

Örneğin
her sitenden data_ver.php dosyası oluştur buna get ile parametre yollayabilirsin ve o parametrelere göre sorgular yapıp dışa veri verebilirsin böylelikle

site1.com/data_ver.php?tur=yemek&listele=10 vb gibi yemek kategorisindekilerden 10 tane veri listelettin mesela bu veriyi

data_ver.php örnek olarak


$sorg= $db->prepare("SELECT firmaadi,adres FROM firmalar WHERE tur = '$_GET[tur]' LIMIT '$_GET[listele]'");
$sorg->execute();

$veri= $sorg->fetch(PDO::FETCH_ASSOC);
echo json_encode($veri);



Gelelim toplama olacak sitene

veri_al.php



$jsonurl = 'https://site1.com/data_ver.php?tur=yemek&listele=10';
$jsondata = file_get_contents($jsonurl);
$array = json_decode($jsondata,true);

print_r($array);




bu şekilde verileri dizi olarak alıp kullanabilirsin

umarım faydalı olur

DÜZELTME :

Ek olarak tüm sitelerden çektiğin dizi verilerini array_push() gibi bir fonksiyon kullanarak tek veri haline getirebilirsin




Merhabalar üstadım...

Vakit ayırdığınız, bilginizi paylaştığınız için çok teşekkür ederim...

Veri tabanı sisteminden uzaklaşmayı düşünmüyorum şimdilik.

Çünkü ilgili veri tabanınlarına bağlanarak o veritabanlarındaki verileri başka projelerde kullanma düşüncem var...

Json yönteminde bu nasıl olur bilmiyorum, yolu vardır belki ama nedense bana veri tabanı yöntemi daha uygun geliyor...

Belki de bilgim sınırlı olduğu için tam bir karşılaştırma yapamıyorumdur ve sağlıklı değerlendiremiyorumdur...

Her halikarda yazdığınız kodların işe yarayacağı durumlar muhakkak olur, olacaktır...

İnceleyeceğim...

ÇOK ÇOK TEŞEKKÜR EDERİM TEKRAR...
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.
wmaraci
reklam

YazilimMimari YazilimMimari Eski adi: Turgay Can Kullanıcı
  • Üyelik 25.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Engineering Director
  • Konum İstanbul Avrupa
  • Ad Soyad T** C**
  • Mesajlar 771
  • Beğeniler 2 / 260
  • Ticaret 0, (%0)

BEYAZMASTER adlı üyeden alıntı

Öncelikle ilginiz ve cevabınız için gerçekten teşekkür ederim...


Üstadlığınızı göstermiş ve hem güzel sorular sormuşsunuz hem de çok güzel bir açılım yapmışsınız...
(Her ne kadar paylaştıklarınızı henüz tam anlamasam da...)


CEVAP 1

Gereksinimin nedeni şu;

10 Ayrı şehir için 10 Ayrı veri tabanı oluşturdum...

Hem veri tabanlarının şişmemesi, sayfaların kasılmaması için...

Hem de bir veri tabanına sızılırsa tüm veriler ele geçirilemesin diye...

Her şehir sayfası kendisine ait veri tabanına bağlanıp verilerini sorunsuzca çekiyor.

Lakin bunun yanında bir de tüm şehirlerdeki verileri tek bir sayfada göstermek istiyorum...

Bu ihtiyaç da buradan hasıl oldu.

10 veri tabanına bağlanabiliyorum ve verileri ayrı ayrı çekebiliyorum ama bu tek bir liste oluşturmamı sağlamıyor...

Bir sayfada 10 ayrı liste olmuş oluyor...

Sanırım şu an anladığınız üzere;
10 veri tabanı içindeki verileri tek bir listede toplayıp, hepsini iskambil kağıdı gibi karıştırıp isme yada başka bir sütun değerine göre listelemek istiyorum...


CEVAP 2

Şimdilik web sitesi, mobil uygulamaya da döndürmem gerekiyor sonraki aşamada...


CEVAP 3

Büyüklük terabyte değil ve hiçbirzaman da olacağını sanmam...


Sonraki yazdıklarınız, kullandığınız terimler ciddi birer araştırma konusu benim için...

Şu an bunu yapabilmek olanak dahilinde değil...


Paylaştığım evaplar doğrultusunda ekleyeceğiniz bilgiler ve kod olursa çok sevinirim...


TEKRAR ÇOK TEŞEKKÜR EDİYORUM ÜSTADIM...




Aklıma ilk şu soru geldi? Fazladan bir mühendislik (over engineering) gereksinimi oluşturulmuş gibi.

10 ayrı şehir için 10 ayrı veritabanı oluşturmaktansa, tek bir veri tabanında rahatça yapılabilir gibime geldi..

Veritabanına sızma işlemi yapılırsa kısmı için bu denli bir çözüme gitmek, bana pek doğru gelmedi.

DB'ye erişme ihtimali sunucu taraflı güvenlik açığıdır, bunun için güvenli yazılım + sunucu güvenliği içinde AWS yada yerli bir çözümden destek alınması en doğru yöntem olacaktır. AWS / DigitalOcean üzerinde günlük yedekli bir DB servisi almanızı tavsiye ederim, güvenlik dertleriniz ortadan kalkıp, daha çok yazılım çözümüne odaklı işlere zaman ayırmış olursunuz.

Anladığım kadarıyla zaten büyük bir veri yok ortada..

Mevcut çözümde aklıma gelen en basit çözüm :

Mevcut bir şehirdeki DB 'den DDL scriptlerini alıp ortak DB + şema oluşturun.
Ortak DB'deki tüm tablolara bir discriminator ekleyin. Bu discriminator : ilgili DB yi belirtecek bir şehir ID, NAME gibi unique bir alan olmalı. Birde tüm tablolara deleted bir alan ekleyin (0,1) değerlerini alsın, default değeri 0 olsun.

Saatte bir çalışan job yazın.

job verileri sırasıyla her veritabanından (paginated olarak yada yapabiliyorsanız ve kullandığın db driver destekliyorsa stream ile) çekip, ortak bir DB'ye yazsın. Bir ortak db üzerinden çözüm üretin.

Ortak DB'ye yazarkende, şöyle mantıkta ilerleyin.

Ankara şehrinden bir tablodan verileri çekmeden önce ortak DB'de ilgili tablodaki tüm ankara şehri kayıtlarını soft olarak delete yapın;

soft delete sql : update table_name set deleted = 1 where discriminator = 'ANKARA';

sonrada çekilen verileri insert edin.

Diğer türlüsü ayrı ayrı db 'ye bağlan, verileri topla, sonra sort et :) zahmetli iş.. Heleki bir ekranda sayfalı bir şekilde bu işlem yapılacaksa, Allah kolaylık versin derim.

Veri merkezi bir yerde olduğunda istediğiniz çözümü rahatça gerçekleştirirsiniz.
BEYAZMASTER

kişi bu mesajı beğendi.

https://www.linkedin.com/in/turgaycan/
Kaliteli kod yazılır.. (Günlük/Saatlik ücreti ile)

OmerGunay OmerGunay https://omergunay.net Kullanıcı
  • Üyelik 15.05.2015
  • Yaş/Cinsiyet 33 / E
  • Meslek PHP Developer
  • Konum İstanbul Avrupa
  • Ad Soyad Ö** G**
  • Mesajlar 1207
  • Beğeniler 382 / 381
  • Ticaret 16, (%100)
BEYAZMASTER önceki yorumlarda arkadaşlar gayet güzel örnekler vermişler onları sağlıklı olur senin için ama hani bunlara girmeden yapamaz mıyım dersen şöyle bi dene istersen.

1.veritabanından gelen verileri bir değişkene aktar.
2.veritabanından gelen verileri de aynı değişkene .= ile birleştir.
Bu şekilde 10 tanesini de aynı değişkene aktarmış olursun. Belki böyle çözüme kavuşabilirsin.
BEYAZMASTER

kişi bu mesajı beğendi.

Herkes yediğinden ikram eder..(Yavuz Sultan Selim)

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)

YazılımMimarı adlı üyeden alıntı

Aklıma ilk şu soru geldi? Fazladan bir mühendislik (over engineering) gereksinimi oluşturulmuş gibi.

10 ayrı şehir için 10 ayrı veritabanı oluşturmaktansa, tek bir veri tabanında rahatça yapılabilir gibime geldi..

Veritabanına sızma işlemi yapılırsa kısmı için bu denli bir çözüme gitmek, bana pek doğru gelmedi.

DB'ye erişme ihtimali sunucu taraflı güvenlik açığıdır, bunun için güvenli yazılım + sunucu güvenliği içinde AWS yada yerli bir çözümden destek alınması en doğru yöntem olacaktır. AWS / DigitalOcean üzerinde günlük yedekli bir DB servisi almanızı tavsiye ederim, güvenlik dertleriniz ortadan kalkıp, daha çok yazılım çözümüne odaklı işlere zaman ayırmış olursunuz.

Anladığım kadarıyla zaten büyük bir veri yok ortada..

Mevcut çözümde aklıma gelen en basit çözüm :

Mevcut bir şehirdeki DB 'den DDL scriptlerini alıp ortak DB + şema oluşturun.
Ortak DB'deki tüm tablolara bir discriminator ekleyin. Bu discriminator : ilgili DB yi belirtecek bir şehir ID, NAME gibi unique bir alan olmalı. Birde tüm tablolara deleted bir alan ekleyin (0,1) değerlerini alsın, default değeri 0 olsun.

Saatte bir çalışan job yazın.

job verileri sırasıyla her veritabanından (paginated olarak yada yapabiliyorsanız ve kullandığın db driver destekliyorsa stream ile) çekip, ortak bir DB'ye yazsın. Bir ortak db üzerinden çözüm üretin.

Ortak DB'ye yazarkende, şöyle mantıkta ilerleyin.

Ankara şehrinden bir tablodan verileri çekmeden önce ortak DB'de ilgili tablodaki tüm ankara şehri kayıtlarını soft olarak delete yapın;

soft delete sql : update table_name set deleted = 1 where discriminator = 'ANKARA';

sonrada çekilen verileri insert edin.

Diğer türlüsü ayrı ayrı db 'ye bağlan, verileri topla, sonra sort et :) zahmetli iş.. Heleki bir ekranda sayfalı bir şekilde bu işlem yapılacaksa, Allah kolaylık versin derim.

Veri merkezi bir yerde olduğunda istediğiniz çözümü rahatça gerçekleştirirsiniz.




Üstadım gene çok komplike bilgiler paylaşmışsınız, tekrar çok teşekkür ederim.

Söylediklerinizi değerlendiremiyorum zira kullandığınız terimlerin nelere karşılık geldiğini dahi bilmiyorum şu anda...
Önce onları öğrenmem gerek değerlendirme yapabilmem için...

Zamanla öğrenmeye çalışacağım...

Tercihim belki öğrendikten sonra da değişmeyebilir ama konuya tam hakim olmak için öğrenmek gerek...

Sizce 50.000 işletme için çoğu char (255 karakter altındaki) 250 sütunluk 1'er kayıt satırının toplamı büyük bir veri midir?

Tümünü 1 tek veri tabanında bulundurmak uygun mudur?

Veri merkezi (hostingi kasdediyorsunuz sanırım) ve domain/ler aynı firmada bulunuyor ise...
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.
wmaraci
wmaraci

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)

ÖmerGünay adlı üyeden alıntı

BEYAZMASTER önceki yorumlarda arkadaşlar gayet güzel örnekler vermişler onları sağlıklı olur senin için ama hani bunlara girmeden yapamaz mıyım dersen şöyle bi dene istersen.

1.veritabanından gelen verileri bir değişkene aktar.
2.veritabanından gelen verileri de aynı değişkene .= ile birleştir.
Bu şekilde 10 tanesini de aynı değişkene aktarmış olursun. Belki böyle çözüme kavuşabilirsin.


Hocam cevabınız ve öneriniz için çok teşekkür ederim.

Paylaştığınız her 2 maddenin nasıl icra edildiğini bilmiyorum sanırım...

Araştırmam gerek...
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)
Geçici olarak bulduğum çözümü paylaşayım;

10 ayrı veri tabanından verileri çekip listeliyorum.

Tümünü bir filtre class'ının içine koyup filtre yardımı ile sıralamaya ve filtrelemeye tabi tutuyorum...

Bilgim ancak buna yetti şimdilik...

İDEAL BİR ÇÖZÜM MÜDÜR VE DAİMİ OLARAK KALMALI MI SİZCE?
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.

YazilimMimari YazilimMimari Eski adi: Turgay Can Kullanıcı
  • Üyelik 25.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Engineering Director
  • Konum İstanbul Avrupa
  • Ad Soyad T** C**
  • Mesajlar 771
  • Beğeniler 2 / 260
  • Ticaret 0, (%0)

BEYAZMASTER adlı üyeden alıntı

Üstadım gene çok komplike bilgiler paylaşmışsınız, tekrar çok teşekkür ederim.

Söylediklerinizi değerlendiremiyorum zira kullandığınız terimlerin nelere karşılık geldiğini dahi bilmiyorum şu anda...
Önce onları öğrenmem gerek değerlendirme yapabilmem için...

Zamanla öğrenmeye çalışacağım...

Tercihim belki öğrendikten sonra da değişmeyebilir ama konuya tam hakim olmak için öğrenmek gerek...

Sizce 50.000 işletme için çoğu char (255 karakter altındaki) 250 sütunluk 1'er kayıt satırının toplamı büyük bir veri midir?

Tümünü 1 tek veri tabanında bulundurmak uygun mudur?

Veri merkezi (hostingi kasdediyorsunuz sanırım) ve domain/ler aynı firmada bulunuyor ise...


Kesinlikle büyük veri değildir.

Çözüm için yapılacak listeyi yazmıştım.

1 - Mevcut bir DB'ni export, import edip, tüm tablolara discriminator eklemen.

import ettikten sonra (oracle syntax yazıyorum) ;
alter table_name add discriminator varchar2(50 char);
alter table_name add deleted numner(1) default 0;

2 - php ile yazıyorsun sanırım cron/scheduler job kullanmak gerek.
Örnek bir kütüphane : https://github.com/lavary/crunz

3 - Bu kütüphane ile her saat başı çalışacak bir process yazacaksın.

Her saat başı Cron expression : 0 0 0/1 1/1 * ? *

Ref for cron expression : http://www.cronmaker.com/

Yada Kütüphanedeki kod olarak aynı kullanım : her saat 'in 10. dakikasında çalış gibi

00:10
01:10
02:10

gibi.

// ...
$task = $schedule->run(PHP_BINARY . 'collect-data-from-distributed-dbs-to-common-db.php');
$task
->hourlyAt('10');
// ...

Buradaki işi yapmayı kolaylaştırmak için common db'de bir tane tablo oluşturup, 10 tane veri tabanının bilgilerini tutun.

//oracle syntax'ıdır. siz mysql syntax ile yazarsınız.

create table dist_city_dbs {
city_name varchar2(50 char) not null unique,
db_conn_info varchar(255 char) not null
}

Örnek -> 'ANKARA', 'server=217.10.12.231;uid=ankara_db;pwd=ank_123_db12e;database=ankara'

collect-data-from-distributed-dbs-to-common-db.php -> dosyası içerisinde db lere bağlanıp, veri çekip, ortam db ye yazma işi yapacaksınız.

//pseudo kod

//select city_name, db_conn_info from dist_city_dbs order by city_name asc -> dist_city_dbs tablosundaki veriyi çekin
//tablodan gelen veriyi loop içerisinde dönün.
loop içinde sırasıyla;
- common db'deki verir çekilecek tabloya update işlemi yapılır.
update common-db.table_name set deleted = 0 where discriminator = city_name;
- db_conn_info değeri ile uzaktaki "ANKARA" şehri DB'sine bağlan
- select * from table_name order by ID asc; //ID değeri string ise create_date asc gibi bir alan kullanın
- uzaktaki şehir db bağlantısını kapat
- gelen veriyi common-db'deki aynı tabloya insert edilecek. discriminator değer olarak city_name set edilmeli.
- common-db bağlantısını kapat


Tüm işlem bu kadar.. Bu hali ile de geliştirilecek ve hataya açık bir yönü var.
Ama ilk adımı atın sonrası zaten hata ile karşılaşıldıkça çözülür.
BEYAZMASTER

kişi bu mesajı beğendi.

https://www.linkedin.com/in/turgaycan/
Kaliteli kod yazılır.. (Günlük/Saatlik ücreti ile)

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)
VAY BE!

DAHA KOMLİKE BİR CEVAP...


Üstadım çok sağolun...

Bu cevabı kaydedeceğim ve zamanla anlamya ve uygulama çalışacağım...

Emeğinizden, ayırdığınız vakitten dolayı lütfen HAKKINIZI HELAL EDİNİZ...

Son sorum şu olsun;

"Kesinlikle büyük veri değil" demişsiniz.

Buradan hareketle 50.000 satırlık veriyi tek veri tabanına kaydetsem ne gibi sorun/lar yaşatır!?

Eğer sorun oluşturmayacak ise bu en pratik yol olur sanırım...

Ne dersiniz?
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.

YazilimMimari YazilimMimari Eski adi: Turgay Can Kullanıcı
  • Üyelik 25.06.2012
  • Yaş/Cinsiyet 38 / E
  • Meslek Engineering Director
  • Konum İstanbul Avrupa
  • Ad Soyad T** C**
  • Mesajlar 771
  • Beğeniler 2 / 260
  • Ticaret 0, (%0)

BEYAZMASTER adlı üyeden alıntı

VAY BE!

DAHA KOMLİKE BİR CEVAP...


Üstadım çok sağolun...

Bu cevabı kaydedeceğim ve zamanla anlamya ve uygulama çalışacağım...

Emeğinizden, ayırdığınız vakitten dolayı lütfen HAKKINIZI HELAL EDİNİZ...

Son sorum şu olsun;

"Kesinlikle büyük veri değil" demişsiniz.

Buradan hareketle 50.000 satırlık veriyi tek veri tabanına kaydetsem ne gibi sorun/lar yaşatır!?

Eğer sorun oluşturmayacak ise bu en pratik yol olur sanırım...

Ne dersiniz?


50bin satır, çok kaale alınacak veri boyutu değildir.

Çalıştığım ortalama bir sistemde dakika bir tabloya 30K veri yazıyor. Günlük partition yaparak, ortalama 50m kayıtlı tabloya sorgu atıp, ms içinde cevap alabiliyoruz.

Tabi sorgu atarken where koşulundan sonraki alanlarda index olması, attığım sorguda zaman limitasyonu gibi ek düşünülmüş işler var ama 50K tablo ile sorun yaşamanız pek mümkün değil.

Bolca sorgu gelen tablolarınızın where koşulunda kullandığınız alanlara index atın, ms içinde cevaplar alırsınız.
BEYAZMASTER

kişi bu mesajı beğendi.

https://www.linkedin.com/in/turgaycan/
Kaliteli kod yazılır.. (Günlük/Saatlik ücreti ile)

BEYAZMASTER BEYAZMASTER YÜCE ALLAH'IN aciz 1 kulu Kullanıcı
  • Üyelik 04.02.2020
  • Yaş/Cinsiyet 43 / E
  • Meslek Yazılım...
  • Konum Diğer
  • Ad Soyad O** B**
  • Mesajlar 597
  • Beğeniler 154 / 153
  • Ticaret 0, (%0)

YazılımMimarı adlı üyeden alıntı

50bin satır, çok kaale alınacak veri boyutu değildir.

Çalıştığım ortalama bir sistemde dakika bir tabloya 30K veri yazıyor. Günlük partition yaparak, ortalama 50m kayıtlı tabloya sorgu atıp, ms içinde cevap alabiliyoruz.

Tabi sorgu atarken where koşulundan sonraki alanlarda index olması, attığım sorguda zaman limitasyonu gibi ek düşünülmüş işler var ama 50K tablo ile sorun yaşamanız pek mümkün değil.

Bolca sorgu gelen tablolarınızın where koşulunda kullandığınız alanlara index atın, ms içinde cevaplar alırsınız.




Üstadım verdiğiniz cevaplar gerçekten çok önemli ve yol haritamı aydınlatıcı olmaya başladı.

("Bolca sorgu gelen tablolarınızın where koşulunda kullandığınız alanlara index atın, ms içinde cevaplar alırsınız" bu kısmı henüz anlamadım zamanla anlarım diye düşünüyorum...)

Paylaştığınız "deneyimler ve bilgiler" doğrultusunda veri tabanımı parçalara bölme stratejisinden vazgeçeceğim sanırım...

Ramak kaldı...

Veri tabanı konusunda uzman olduğunuz çok net...

İyi ki sorumu gördünüz ve katkı sağladınız...

ÇOK ÇOK TEŞEKKÜR EDİYORUM...
 

 

ÖNCE "İYİ,DOĞRU,GÜZEL BİR İNSAN" OLMAK (VEFA,TEVAZZU,NAİFLİK,SAYGI,...) GEREK!
Sonra wm oluruz.
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al