Category - SubCategory relation

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
wabbit
Δημοσιεύσεις: 52
Εγγραφή: 24 Αύγ 2006 22:55

Category - SubCategory relation

Δημοσίευση από wabbit » 09 Φεβ 2007 20:48

Είμαι λίγο μπερδεμένος και προσπαθώ να βρώ ποιος είναι ο καλύτερος τρόπος για να φτιάξω ένα μενού με κατηγορίες και υποκατηγορίες θεμάτων.
Μέχρι στιγμής έχω 3 tables, το ένα έχει CAT-CODE, CAT-DESCRIPTION, το άλλο SUBCAT-CODE, SUBCAT-DESCRIPTION, και το τρίτο είναι σε μορφή:

CAT-CODE | SUBCAT-CODE

categ1 subcat1
categ1 subcat2
categ1 subcat3
categ2 subcat1
categ3 subcat1
categ4 subcat2

Τα δυο πρώτα tables είναι σαν να κάνω SELECT DISCTINCT CAT, SUBCAT from items απλά υπάρχουν σε ξεχωριστό table γιατί τα items καμιά φορά ξεπερνούν τις 10,000 και πιστεύω πως βαρένουν τα disctinct queries σε τέτοιες περιπτώσεις, εκτός και αν κάνω λάθος. Τώρα για να κάνω κάτι σε αυτήν την μορφή:

<ul>
<li class="t"><h1>Categories</h1></li>
<li><a href="?act=search&cat=CLO" title="CLO">CLOTHING</a>
<ul>
<li><a href="#">Hats</a></li>
<li><a href="#">Pants</a></li>
<li><a href="#">T-shirts</a></li>
</ul>
</li>
<li><a href="?act=search&cat=DHW" title="DHW">DECK HARDWARE</a></li>
<li><a href="?act=search&cat=ELE" title="ELE">ELECTRICAL</a>
<ul>
<li><a href="#">Microwaves</a></li>
<li><a href="#">Tvs</a></li>
<li><a href="#">Computers</a></li>
</ul>
</li>
</ul>

Είναι καλύτερο να κάνω 3 queries και να βρώ κάποιον τρόπο να ενώσω τα arrays μου για να βγάλω το παραπάνω output ή είναι καλύτερα να κάνω ένα query, με 2 Inner joins, για να έχω όλα τα code και description απο cats, subcats; Και ποιος ο καλύτερος τρόπος να οργανώσω αυτά τα arrays; Είμαι λίγο χαμένος. Υπόψην οτί η βάση βρίσκεται σε remote μηχάνημα οπότε αν υπάρχουν πολλές κατηγορίες και ίσως κοινές υποκατηγορίες που θα επαναλαμβάνονται σε αυτό το INNER JOIN query, ίσως να είναι μεγάλο traffic μέσω ίντερνετ γιατί το μενού θα εμφανίζεται σε κάθε σελίδα.
Η τρίτη λύση βέβαια είναι να αντιγράψω αυτές της κατηγορίες, υποκατηγορίες σε local βάση και να φτίαξω έναν admin panel οπού θα μπορούν να αφαιρούν ή να προσθέτουν καινούργιες. Και πάλι ομώς αν τις περάσω local ποιος είναι ο καλύτερος τρόπος να τις περάσω στην βάση; Να της βάλω όλες σε ένα table με στήλες CAT_CODE, CAT_DESC, SUBCAT_CODE, SUBCAT_DESC όπως δηλαδή το πρώτο table που ανέφερα παραπάνω με multiple lines της κατηγορίας αλλά να βάλω τις περιγραφές στο ίδιο table; Είναι σωστό αν ένα category έχει 10 subcategories, να επαναλαμβάνοντε οι περιγραφές 10 φορές;

Άβαταρ μέλους
alexandr0s
Δημοσιεύσεις: 1064
Εγγραφή: 25 Απρ 2006 17:16
Τοποθεσία: localhost
Επικοινωνία:

Category - SubCategory relation

Δημοσίευση από alexandr0s » 11 Φεβ 2007 20:15

Δεν χρειάζεται να έχεις 3 πίνακες για αυτή τη δουλειά. Ένας πίνακας με cat_code, cat_desc, parent_cat_code κάνει (το τελευταίο πεδίο ουσιαστικά είναι foreign key του ίδιου πίνακα όπου αν είναι null σημαίνει ότι είναι αρχική κατηγορία).

wabbit
Δημοσιεύσεις: 52
Εγγραφή: 24 Αύγ 2006 22:55

Category - SubCategory relation

Δημοσίευση από wabbit » 12 Φεβ 2007 22:45

Χμμ. έξυπνο, δεν το είχα σκευτεί έτσι. Δηλαδή σε αυτήν την περίπτωση δεν θα έχω unique cat_code, αλλά λογικά για να μην έχω προβλήματα θα πρέπει ο συνδιασμός cat_code + parent_cat_code να είναι unique. Γίνεται αυτό; σε mysql για παράδειγμα πως θα το έκανα; Το καλό πάντως είναι οτί με αυτόν τον τρόπο θα μπορώ εύκολα να έχω ένα multiple-dimensions table, το μόνο πρόβλημα θα ήταν οτί θα πρέπει να κάνω το cat_code unique για να μην μπερδεύομαι με πολλές υποκατηγορίες. Με 2 dims πάντως δεν θα έχω κανένα πρόβλημα.
Ευχαριστώ πολύ.

Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Category - SubCategory relation

Δημοσίευση από Rapid-eraser » 15 Φεβ 2007 08:18

apla 8elei ligo prosoxi stous elegxous miv pas kai kaveis chain kapoio parent pou eivai child se kapoia katigoria :P
giati afto 8a dimiourgisei endless loops :)

Idiki periptosi dld afto px

Κώδικας: Επιλογή όλων

0 - 1
     1 - 4
          4 - 6
     1 - 5
0 - 2
     2 - 7
          7 - 8
0 - 3
To proto voumero eivai to parent kai to deftero to child

ama pas kai baleis stnv katigoria 4 - 6 child px to 1 tote ekaves eva endless loop :P
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

wabbit
Δημοσιεύσεις: 52
Εγγραφή: 24 Αύγ 2006 22:55

Category - SubCategory relation

Δημοσίευση από wabbit » 15 Φεβ 2007 22:29

Κοίτα μέχρι στιγμής έχω categories και subcategories, και είναι 1 Level τα childs.

Έχω ένα table με τα category_code|category_description, και ένα που έχει subcat_code, subcat_desc, και parent_categ

Παράδειγμα:

1o Table
CODE | DESCRIPTION
CLO|Clothing
ELE|Electrical

2ο Table:
PARENT | CODE | DESCRIPTION
CLO | HATS | Hats
CLO | PANTS | Pants
CLO | TSHIR | T-shirts
ELE | PC | Computers
ELE | MICRO | Microwaves
ELE | TV | Televisions

To HTML που θέλω είναι:
<ul>
<li class="t"><h1>Categories</h1></li>
<li class="sub"><a href="?act=search&cat=CLO">CLOTHING</a>
<ul>
<li><a href="?act=search&cat=CLO&subcat=HATS">Hats</a></li>
<li><a href="?act=search&cat=CLO&subcat=PANTS">Pants</a></li>
<li><a href="?act=search&cat=CLO&subcat=TSHIR">T-shirts</a></li>
</ul>
</li>
<li class="sub"><a href="?act=search&cat=ELE">Electrical</a>
<ul>
<li><a href="?act=search&cat=ELE&subcat=PC">Computers</a></li>
<li><a href="?act=search&cat=ELE&subcat=MICRO">Microwaves</a></li>
<li><a href="?act=search&cat=ELE&subcat=TV">Televisions</a></li>
</ul>
</li>

Και ο κώδικας που έφτιαξα μέχρι στιγμής είναι:

Κώδικας: Επιλογή όλων

  <ul>
  <li class="t"><h1>Categories</h1></li>
<?
while &#40; $result->fetchInto&#40;$tmpdata&#41; &#41; &#123;

	$cat = $tmpdata&#91;'PARENT'&#93;;
	if &#40;$cat != $tmp && $close_ul == true&#41; &#123;
		echo "    </ul>\n";
		echo "  </li>\n";
	&#125;
	if &#40;$cat != $tmp&#41; &#123; // New Category
		echo "  <li class=\"sub\"><a href=\"?act=search&cat=$cat\">".$categs&#91;$cat&#93;."</a>\n";
		echo "    <ul>\n";
	&#125;
	echo "    <li><a href=\"?act=search&cat=$cat&subcat=".$tmpdata&#91;'CODE'&#93;."\">".$tmpdata&#91;'DESCRIPTION'&#93;."</a></li>\n";
	$tmp = $cat;
	$close_ul = true;

&#125;
echo "    </ul>";
echo "  </li>";
Το loop βέβαια γίνεται λίγο ανάποδα, αλλά δεν πειράζει, σημασία έχει οτί δουλεύει. Μου φένεται πιο απλός τρόπος για την περίπτωση μου απο τα recursive και Preorder Tree Traversal παραδείγματα που έχω βρει στο internet, και γίνεται μόνο με ένα loop την ώρα που κάνει το query.

Τώρα αν το recursive έιναι αρκετά μεγάλο το RDBMS δεν είναι λύση. Το XML έιναι καλύτερο για αυτήν την περίπτωση αλλά είναι περιορισμένο το μέγεθος του. Δηλαδή αν είναι πολύ μεγάλο το αρχείο θα πρέπει να μοιραστεί σε πολλά μικρά αρχεία. Εκτός και αν γίνει χρήση Ajax και γίνεται ένα query κάθε φορά που κάνουμε hover επάνω στην κατηγορία και τα φορτώνει στην cache του browser ή εκτός αν το κάνω με drop-down boxes ή κάποια άλλη μέθοδο, όπως flash για να βοηθήσει στο waiting time που χρειάζεται την ώρα που γίνεται το query σε περίπτωση που είναι busy ο server ή υπάρχει καθυστέριση για κάποιον λόγο. Απλά προσπαθώ να σκευτώ ποια είναι η καλύτερη λύση για να φτιάξει κάποιος ένα τεράστιο Hiearchical Tree. Ίσως να είναι άλλο θέμα αυτό αλλά εσείς τι πιστεύεται οτί θα ήταν καλύτερη μέθοδος;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Category - SubCategory relation

Δημοσίευση από dva_dev » 16 Φεβ 2007 17:23

Εξηγείς τι εννοείς με το αυτό;
Τώρα αν το recursive έιναι αρκετά μεγάλο το RDBMS δεν είναι λύση. Το XML έιναι καλύτερο για αυτήν την περίπτωση αλλά είναι περιορισμένο το μέγεθος του. Δηλαδή αν είναι πολύ μεγάλο το αρχείο θα πρέπει να μοιραστεί σε πολλά μικρά αρχεία.
Αν κατάλαβα αυτό που κάνεις το θέλεις για να φτιάξεις μενού.
Αν το μενού έχει πολλές επιλογές αφήνοντας μόνο αυτά τα δύο levels τότε θα γίνει δύσχρηστο πολύ πριν αρχίσεις να καταλαβαίνεις ότι ζορίζεται είτε η database είτε το xml.
Αν σκοπεύεις να βάλεις πολλές επιλογές ίσως είναι προτιμότερο να φτιάξεις ένα μενού με 2-3 levels και απο κεί και πέρα να προσφέρεις κάποια λίστα (είτε απλή είτε ιεραρχική), με ή χωρίς σελιδοποίηση.
Οπως και να έχει, περισσότερο θα ζοριστεί ο web server να δείξει τα δεδομένα στη σελίδα παρά η database/xml να σου τα φέρει.

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες