παπι Δημοσ. 24 Ιουλίου 2016 Δημοσ. 24 Ιουλίου 2016 μπαλ μπλα μπλα μπλα. Και που λες εφτασα να εχω αυτο το query public function getactiveorders() { if($this->ion_auth->logged_in()) { $output = array(); $res = $this->db ->select('orders.id,orders.ts_create,orders.ts_promise,orders.state,orders.ts_done,addresses.lat,addresses.lng,addresses.fullAddress,customers.name,customers.phone') ->from('orders') ->where('orders.state','store') ->join('customers','orders.id_customer = customers.id') ->join('addresses','customers.id_addresses = addresses.id') ->get() ->result(); foreach($res as $row) { $output[] = array( 'fullAddress' => $row->fullAddress, 'location' => array('lat' => floatval($row->lat),'lng' => floatval($row->lng)), 'name' => $row->name, 'status' => $row->state, 'id' => $row->id ); } echo json_encode($output); } } Αυτο ειναι καλο ή κακο; Δηλαδη το κριτηριο μπανει στο πινακα orders, απο εκει παω με fk στο customers και απο κει με fk στο addresses. Θα ηταν κλαυτερα να βαλω fk orders -> addresses ή δεν υπαρχει προβλημα; 1
defacer Δημοσ. 24 Ιουλίου 2016 Δημοσ. 24 Ιουλίου 2016 Όλα καλά, τυπικό σενάριο, και 2 joins... δεν είναι πολλά. 3
παπι Δημοσ. 24 Ιουλίου 2016 Μέλος Δημοσ. 24 Ιουλίου 2016 Βασικα το αλλαξα και εβαλα fk order -> address, οχι για τα join που ετσι και αλλιως μενουν ως εχουν. Αλλα επειδη υπαρχει λογικο λαθος στο οτι customer == address. Θα βγαλω και το fk customer -> address και θα βαλω αλλο πινακα που θα εχει fk address fk customer. Βασικα ο νεος πινακας θα πρεπει να εχει fk; ή απλα idx customer_idx address_idx χωρις να ειναι fk. Η ουσια ειναι να κανεις ενα select customer id και να δεις ποιες addresses εχει. edit; μου ηθελα και plain php... θα φευγανε οι χριστοπαναγιες απο τον νεο κοσμος κια θα φτανανε μεχρι την βουλα
Xvipes Δημοσ. 24 Ιουλίου 2016 Δημοσ. 24 Ιουλίου 2016 Όλα καλά, τυπικό σενάριο, και 2 joins... δεν είναι πολλά. $supplierList = $objSupplier->getCustomSql("SELECT * FROM `ordItem` AS a INNER JOIN memberΑff AS b ON a.memAffId = b.memId INNER JOIN prodCache AS c ON a.prodId = c.prodId INNER JOIN memb AS d ON d.memId = b.memId INNER JOIN suppl AS e ON e.supId = a.supId WHERE (dateSelected BETWEEN ".$dateFrom." AND ".$dateTo.") AND affType='api' ORDER BY a.memberAffId ASC"); Πότε πρέπει να ανησυχήσει κάποιος? Ρωτάω γιατί με απασχολεί και εμένα αυτές τις μέρες ότι έχω φτάσει στο παραπάνω σημείο. Όταν εξ αρχής δεν ήξερες ότι θα γίνει έτσι το project τι σου μένει να κάνεις? Redesign όλη τη βάση? p.s ελπίζω να μην έκανα hijack, για δείγμα τον έβαλα τον κώδικα. Για τον τίτλο του thread ρωτάω και εγώ
ParhsG Δημοσ. 24 Ιουλίου 2016 Δημοσ. 24 Ιουλίου 2016 Οι σχεσιακές βάσεις χοντρικά βασίζονται στις σχέσεις (σχεσιακή άλγεβρα). Αυτή είναι η δουλειά τους να κάνουν join κτλ. Αν αρχίσουν τα προβλήματα τότε έχει νόημα να κάνεις βελτιστοποιήσεις κτλ.
tasanton Δημοσ. 28 Ιουλίου 2016 Δημοσ. 28 Ιουλίου 2016 Και denormalization σε αρκετές περιπτώσεις....
DeltaLover Δημοσ. 28 Ιουλίου 2016 Δημοσ. 28 Ιουλίου 2016 Συμφωνώντας με τους προλαλήσαντες, νομίζω ότι το συγκεκριμένο snippet είναι απόλυτα αποδεκτό τόσο από την καθαρά "λογική" του πλευρά καθώς αποτελεί σαφή περίπτωση της First Normal Form όσο επίσης και όσον αφορά τo performance (εννοείται ότι έχεις δημιουργήσει τα σχετικά indexes) . Hint: Δες αν μπορείς να χρησιμοποίσεις Memoization για να μετριάσεις το db traffic.
antonisid Δημοσ. 30 Ιουλίου 2016 Δημοσ. 30 Ιουλίου 2016 Μιας και αναφέρθηκε το θέμα της απόδοσης, τελευταία έχω περιορίσει σημαντικά τα joins σε πίνακες. 3 queries πχ ένα για τον κάθε πίνακα, έχουν καλύτερο performance απ ότι 1 query με 3 joins.
pmav99 Δημοσ. 30 Ιουλίου 2016 Δημοσ. 30 Ιουλίου 2016 @antonisid Δεν ισχύει σε κάθε περίπτωση αυτό. Αν ή βάση σου είναι απομακρυσμένη το bottleneck είναι το network. Γενικά πρέπει να το βλέπεις case by case υπολογίζοντας όλες τις παραμέτρους κάθε φορά. Επίσης για να έχει νόημα ή σύγκριση πρέπει να κάνεις profiling στον κώδικά και όχι στα queries. Γιατί δεν είναι σίγουρο ότι ο συνολικός χρόνος/χρήση RAM/whatever θα είναι μικρότερα. υγ. Εννοείται ότι όταν μιλάμε για joins έχουν γίνει τα απαραίτητα indexes και ότι το scheme είναι σωστά σχεδιασμένο.
antonisid Δημοσ. 31 Ιουλίου 2016 Δημοσ. 31 Ιουλίου 2016 @antonisid Δεν ισχύει σε κάθε περίπτωση αυτό. Αν ή βάση σου είναι απομακρυσμένη το bottleneck είναι το network. Γενικά πρέπει να το βλέπεις case by case υπολογίζοντας όλες τις παραμέτρους κάθε φορά. Επίσης για να έχει νόημα ή σύγκριση πρέπει να κάνεις profiling στον κώδικά και όχι στα queries. Γιατί δεν είναι σίγουρο ότι ο συνολικός χρόνος/χρήση RAM/whatever θα είναι μικρότερα. υγ. Εννοείται ότι όταν μιλάμε για joins έχουν γίνει τα απαραίτητα indexes και ότι το scheme είναι σωστά σχεδιασμένο. Συμφωνώ σε όλα! Γι αυτό είπα άλλωστε ότι τα έχω περιορίσει, καθώς εξαρτάται την περίπτωση.
nikos_90 Δημοσ. 12 Αυγούστου 2016 Δημοσ. 12 Αυγούστου 2016 μπαλ μπλα μπλα μπλα. Και που λες εφτασα να εχω αυτο το query public function getactiveorders() { if($this->ion_auth->logged_in()) { $output = array(); $res = $this->db ->select('orders.id,orders.ts_create,orders.ts_promise,orders.state,orders.ts_done,addresses.lat,addresses.lng,addresses.fullAddress,customers.name,customers.phone') ->from('orders') ->where('orders.state','store') ->join('customers','orders.id_customer = customers.id') ->join('addresses','customers.id_addresses = addresses.id') ->get() ->result(); foreach($res as $row) { $output[] = array( 'fullAddress' => $row->fullAddress, 'location' => array('lat' => floatval($row->lat),'lng' => floatval($row->lng)), 'name' => $row->name, 'status' => $row->state, 'id' => $row->id ); } echo json_encode($output); } } Αυτο ειναι καλο ή κακο; Δηλαδη το κριτηριο μπανει στο πινακα orders, απο εκει παω με fk στο customers και απο κει με fk στο addresses. Θα ηταν κλαυτερα να βαλω fk orders -> addresses ή δεν υπαρχει προβλημα; Code igniter ε? Δοκιμασε να χρησιμοποιησεις doctrine, νομιζω εχουν βγαλει library και για codeigniter
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα