Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

SQL Optimization advice: isDeleted σε Header και Details table

  •  07-08-2013, 20:31

    SQL Optimization advice: isDeleted σε Header και Details table

    Καλησπέρα σας,

    έχω 2 κλασικούς πίνακες (έστω παραστατικών).

     Στον 1ο αποθηκεύω την «κεφαλή» του παραστατικού και στον 2ο τις λεπτομέρειές του (αντικείμενα) με foreign key το id του πρώτου πίνακα. 

     Έστω τώρα ότι διαγράφω το παραστατικό οπότε πάω στον πρώτο πίνακα και θέτω το πεδίο isDeleted = 1. 

    Στον δεύτερο πίνακα δεν έχω παρόμοιο πεδίο ώστε να πω και στις γραμμές του isDeleted = 1 και αυτό γιατί πάντα στα queries μου θα κοιτάω αν η κεφαλή είναι IsDeleted για να προχωρήσω ανάλογα.

    Βρήκα όμως μια περίπτωση όπου κάνω πρώτα left join στον δεύτερο πίνακα (κρατάω και στοιχεία για κάτι άλλο πέρα από τις γραμμές του παραστατικού) και μετά Join με τον 1ο ώστε να ελέγξω εάν είναι διεγραμμένο.

    Π.χ.

     σε κάποια ερωτήματα πάω πρώτα από τον πίνακα 1 (Timologia)

    SELECT bl.Barcode

    FROM Timologia as t

     INNER JOIN Timologio_Deltia as td

     ON t.id = td.timologioId

     INNER JOIN DeltiaAgoras as dag

     ON td.deltioAgorasID = dag.id and dag.isdeleted=0

    INNER JOIN BCLog as bl ON dag.id = bl.deltio_agoras_id 

     Where t.isDeleted = 0 

    ..... , οπότε εδώ είμαι οκ.

     

    Σε περίπτωση που πάω από την ανάποδη όμως,

    SELECT bl.Barcode 

    FROM DeltiaAgoras as dag

    LEFT JOIN Timologio_Deltia as td 

    ON dag.id = td.deltioAgorasID and (select t2.isdeleted from timologia as t2 where t2.id =td.timologioId)=0 

    LEFT JOIN Timologia as t 

    ON td.timologioId = t.id and t.isdeleted = 0

    LEFT JOIN BCLog as bl ON bl.deltio_agoras_id = dag.id

     ...

     εάν δεν βάλω την υπογραμμισμένη συνθήκη παίρνω πολλαπλές εγγραφές γιατί πάει πρώτα στον 2ο πίνακα οπότε και join-άρει και με εγγραφές που ανήκουν σε διαγραμμένα παραστατικά.

     

    Και ρωτάω, για να μη μακρολογώ. Μήπως είναι καλύτερα και πιο σωστά γενικά, να βάλω απλά ενα πεδίο Isdeleted και στον 2ο πίνακα ή το αφήνω έτσι καλύτερα;

     

     

    Ευχαριστώ πολύ  

    Δημοσίευση στην κατηγορία: , ,
Δείτε όλες τις δημοσιεύσεις της Θεματική Ενότητας
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems