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

 

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

Recursive queries

Îåêßíçóå áðü ôï ìÝëïò isidoros. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 06-10-2004, 00:57. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-10-2004, 00:42 229

    Recursive queries

    Έχει δει κανένας τα Recursive queries στον SQL 2005 (beta). Είναι αντίστοιχα με της Oracle ?

    Το «λογικό» πρόβλημα που έχω είναι το εξής.

    Ας υποθέσουμε σε μια εμπορική εφαρμογή οι κατηγορίες των ειδών έχουν δενδροειδή μορφή και είναι κάπως έτσι :

    • SW
    o OS
    ? Microsoft
    ? Linux
    ? DOS
    ? Other
    o OFFICE
    o TOOLS
    • Η/W
    o SERVERS
    o PCs
    ? IBM
    ? DELL
    o NOTEBOOKS
    ? HP
    ? Compaq
    ? IBM

    Ο πίνακας που περιέχει τα data αυτά είναι ο εξής :

    ID Name Parent ID
    1 SW 0
    2 OS 1
    3 Microsoft 2
    4 Linux 2
    5 DOS 2
    6 Other 2
    7 Office 1
    8 Tools 1
    9 HW 0
    10 Servers 9
    11 PCs 9
    12 IBM 11
    13 DELL 11
    14 NOTEBOOKS 9
    15 HP 14
    16 Compaq 14
    17 IBM 14

    Αν γίνει μία πώληση σε ένα είδος που ανήκει στην κατηγορία Microsoft (ID=3) τότε αυτή η πώληση θα πρέπει να μετρήσει σε όλες τις από πάνω της (OS και SW)

    (σ.σ. τα επίπεδα δεν είναι standard. Αλλού μπορεί να είναι 2 επίπεδα βάθος αλλού 6 κλπ όπως επίσης δεν είναι απαραίτητο τα είδη να ανήκουν μόνο στην τελευταία κατηγορία του κάθε δέντρου)

    Με function μέσα από τον SQL δεν τα κατάφερα διότι δεν μπορούσα να καλέσω μία την ίδια function μέσα από τον εαυτό της ώστε να δημιουργήσω έναν βρόγχο και να φτάσω από την τελευταία κατηγορία στην πρώτη

    Ο τρόπος με τον οποίο έλυσα το πρόβλημα αλλα «δεν μου αρέσει» είναι ο εξής
    Υπάρχει ένας άλλος πίνακας που κρατάει όλη την δομή του δέντρου.

    Δηλαδή
    για την κατηγορία Microsoft έχει δύο εγγραφές

    ID Parent ID
    3 (Microsoft) 2 (OS)
    3 (Microsoft) 1 (SW)

    για την κατηγορία linux έχει άλλες δύο εγγραφές

    ID Parent ID
    4 (Linux) 2 (OS)
    4 (Linux) 1 (SW)

    Οπότε με τα αντίστοιχα joins επιτυγχάνεται ο σκοπός.

    Έχει ιδέα κανείς με τα Recursive queries αν αυτό επιτυγχάνεται ?

    Seretis Isidoros
    ----------------------
    Join the army
    Travel the world,
    Meet interesting people
    And kill them.
  •  06-10-2004, 00:57 231 σε απάντηση της 229

    Re: Recursive queries

    Recursive? ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ-ΚΑΚΟ

    Και αυτά που υπάρχουν στην Oracle είναι ψιλοχακιά. Από πίσω η Oracle δημιουργεί ένα Temporary View το οποίο υλοποιεί την ιεραρχία σαν self-join. Νομίζω χρησιμοποιεί και cursor (φτού κ**ά!). Συντακτικά μπορεί να βολεύει αλλά από πλευράς απόδοσης έχει το ίδιο πρόβλημα με το να έγραφες το SQL με το χέρι.

    Το κόλπο για να φτιάξεις ιεραρχίες, και μάλιστα με ΑΠΛΗ SQL είναι να καταλάβεις ότι και η ιεραρχία είναι σχέση συνόλων. O Joe Celko στο βιβλίο του SQL for Smarties περιγράφει ένα τρόπο να φτιάξεις ιεραρχίες με τη χρήση ενός βοηθητικού πίνακα πετυχαίνοντας άριστη απόδοση. Τη λύση αυτή την περιγράφει και σε ένα παλιό άρθρο του Intelligent Enterprise Magazine, http://www.intelligententerprise.com/001020/celko.shtml, πολύ καλύτερα από ότι θα μπορούσα εδώ. Φέτος μάλιστα έβγαλε και ένα βιβλίο ειδικά για ιεραρχίες, το Trees and Hierarchies in SQL for Smarties.

    Τώρα, τα recursive queries ίσως να κάνουν την ιστορία πιό εύκολη. Θέλει μελέτη το ζήτημα, αλλά η δουλειά μπορεί να γίνει και τώρα χωρίς να καταφύγει κανείς σε αυτά.

    Τη λύση του Celko τη χρησιμοποίησα παλιότερα για να κάνω joins κάποιο πίνακα με ιεραρχικό πίνακα permissions που περιείχε ... εκατομμύρια εγγραφές! Σε καμμία περίπτωση δεν θα πετύχαινα αυτή την ταχύτητα με Oracle ή recursive queries.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems