Προς το περιεχόμενο

Mysql table Primary key Int ή Varchar για SEO


BonJovi

Προτεινόμενες αναρτήσεις

Δημοσ.

Το θέμα είναι το εξής... έχω, π.χ. έναν πίνακα PAGE στην mysql, όπου αποθηκεύονται τα δεδομένα για κάθε σελίδα ενός site. Έχουμε δύο περιπτώσεις:

 

1. Δηλώνουμε ένα πεδίο ID (integer) το οποίο αποτελεί το primary key του πίνακα PAGE. Οπότε κάθε σελίδα μπορούμε π.χ. να τη φέρνουμε με τη μορφή http://www.domain.gr/?id=5. Μπορούμε να έχουμε έξτρα πεδίο NAME για την ονομασία σελίδας.

 

2. Δηλώνουμε ένα πεδίο NAME (varchar) το οποίο αποτελεί το primary key του πίνακα PAGE. Κάθε σελίδα τη φέρνουμε με τη μορφή http://www.domain.gr/page=onoma_selidas.

 

Το σενάριο είναι ότι θέλουμε να εφαρμόσουμε SEO friendly URLS (π.χ. το παράδειγμα η σελίδα στην περίπτωση 2 να έρχεται με τη μορφή http://www.domain.gr/onoma_selidas.

 

Θα ήθελα να μου πείτε ποια είναι τα υπέρ και τα κατά για κάθε περίπτωση.

 

Π.χ. το Id είναι πολύ βολικό σαν primary key. Όμως, από τη στιγμή που η αναζήτηση γίνεται βάσει ονομασίας σελίδας, δε θα ήταν καλό να υπάρχει ευρετήριο στο έξτρα πεδίο NAME (π.χ. UNIQUE αφού κάθε σελίδα είναι μοναδική) για να τις φέρνει πιο γρήγορα? Ή μήπως με αυτό τον τρόπο αρχίζει και 'βαραίνει' η βάση?

 

Επομένως, μήπως είναι καλύτερη η 2η περίπτωση? Με μοναδικό ευρετήριο (primary key) στο πεδίο NAME?

 

Για πείτε απόψεις...

Δημοσ.
Το θέμα είναι το εξής... έχω, π.χ. έναν πίνακα PAGE στην mysql, όπου αποθηκεύονται τα δεδομένα για κάθε σελίδα ενός site. Έχουμε δύο περιπτώσεις:

 

1. Δηλώνουμε ένα πεδίο ID (integer) το οποίο αποτελεί το primary key του πίνακα PAGE. Οπότε κάθε σελίδα μπορούμε π.χ. να τη φέρνουμε με τη μορφή http://www.domain.gr/?id=5. Μπορούμε να έχουμε έξτρα πεδίο NAME για την ονομασία σελίδας.

 

2. Δηλώνουμε ένα πεδίο NAME (varchar) το οποίο αποτελεί το primary key του πίνακα PAGE. Κάθε σελίδα τη φέρνουμε με τη μορφή http://www.domain.gr/page=onoma_selidas.

 

Το σενάριο είναι ότι θέλουμε να εφαρμόσουμε SEO friendly URLS (π.χ. το παράδειγμα η σελίδα στην περίπτωση 2 να έρχεται με τη μορφή http://www.domain.gr/onoma_selidas.

 

Θα ήθελα να μου πείτε ποια είναι τα υπέρ και τα κατά για κάθε περίπτωση.

 

Π.χ. το Id είναι πολύ βολικό σαν primary key. Όμως, από τη στιγμή που η αναζήτηση γίνεται βάσει ονομασίας σελίδας, δε θα ήταν καλό να υπάρχει ευρετήριο στο έξτρα πεδίο NAME (π.χ. UNIQUE αφού κάθε σελίδα είναι μοναδική) για να τις φέρνει πιο γρήγορα? Ή μήπως με αυτό τον τρόπο αρχίζει και 'βαραίνει' η βάση?

 

Επομένως, μήπως είναι καλύτερη η 2η περίπτωση? Με μοναδικό ευρετήριο (primary key) στο πεδίο NAME?

 

Για πείτε απόψεις...

 

Oi indexes επηρεάζουν μόνο την ταχύτητα κατά την καταχώρηση καθώς ενημερώνονται. Απλά θα βαρύνει λίγο το Insert (σε επίπεδα benchmarking μιλάμε πάντα). Με ένα Primary και ένα unique μόνο δεν θα καταλάβεις τίποτα.

 

Τώρα θα μου πεις γιατί αφου΄είναι unique o index στο πεδίο γιατί να μην χρησιμοποιήσω αυτό ως primary key Καθως δεν με νοιάζουν τα null. To αριθμητικό ονομάζεται surrogate key Και το όνομα natural key. Το surrogate key(το αριθμητικό) δεν έχει καμιά σημασία και είναι μόνο για να χαρακτηρίζει το row. Το άλλο όμως χαρακτηρίζει μοναδικά την γραμμή αλλά παρουσιάζει και ένα ενδιαφέρον στον χρήστη . Είναι το όνομα της σελίδας. Άρα σε περίπτωση που κάνεις λάθος και γράψεις λάθος το όνομα της σελίδας ή θέλεις να το αλλάξεις αργότερα αυτό σημαίνει αλλαγή στο primary key και θα πρέπει να αλλάξεις όλες τις συσχετίσεις που έχεις δημιουργήσει. Αυτό βέβαια αν χρησιμοποιείς σωστά τα εργαλεία της βάσης ( foreign key contraints) και με μια σωστή engine δεν θα έχεις πρόβλημα ή γενικότερα πρέπει να ξέρεις τι κάνεις. Γνώμη μου αν και αποτελεί debate είναι χρησιμοποίησε αριθμητικό πεδίο και άσε το όνομα να μπορεί να μεταβληθεί έυκολα.

Δημοσ.

Πολύ ενδιαφέρουσες οι απαντήσεις!

 

Σωστή η παρατήρηση σχετικά με τις συσχετίσεις και τα ξένα κλειδιά. Πάντα, στον τρόπο που σχεδιάζω μία βάση, προσπαθώ να τις τηρώ με τέτοιο τρόπο ώστε η αλλαγή σε κάποια οντότητα να μην επηρεάσει λανθασμένα κάποια άλλη οντότητα. Οπότε από αυτή την άποψη, δε με προβληματίζει αυτό.

 

Από την άλλη, δε γνώριζα ότι οι indexes επηρέαζαν την ταχύτητα μόνο κατά την καταχώρηση. Με βολεύει αρκετά στην περίπτωσή μου από την άποψη ότι με ενδιαφέρει, κυρίως, να έχω ταχύτητα στο SELECT μιας σελίδας και την εμφάνισή της στο site. Το INSERT θα γίνεται από σύστημα διαχείρισης.

 

Συνήθως, παίζω με ID INTEGER και μόνο μια φορά έφτιαξα site με primary key VARCHAR, το οποίο λειτούργησε μια χαρά.

 

Αν τελικά, βάλω primary key internet και unique το name, είναι σωστό οι συσχετίσεις να γίνονται με βάση το name (το ρωτάω επειδή δεν είναι primary).

Δημοσ.

Δεν έπιασα το primary key internet .εξήγησε μας λίγο καλύτερα . Θες να κανείς τις συσχετίσεις σου με το unique key name άρα θα δημιουργείς foreign keys με βάση αυτό το πεδίο. . To primary key τι ρόλο θα παίζει στην όλη υπόθεση ;

 

Μην ξεχνάς ότι η διαφορά primary και unique key είναι ότι το unique επιτρέπει null τιμές .Aξιολογεί μονο τις μη null.

Δημοσ.

Sorry, από κεκτημένη ταχύτητα έγραψα internet. Εννοούσα primary key integer.

 

Θέλω να κάνω τις συσχετίσεις με το πεδίο 'name', διότι, αν έχω π.χ. πίνακα με νέα, θέλω κάθε νέο να έχει ένα πεδίο το οποίο θα είναι foreign key συνδεδεμένο με το name του πίνακα PAGE. Έτσι, ώστε στη λίστα π.χ. των νέων, με μία SELECT να τραβάω και το όνομα της σελίδας στην οποία συνδέεται και να φτιάχνω το αντίστοιχο link, ώστε κάνοντας κάποιος κλικ στον τίτλο του νέου, να οδηγείται απευθείας στη σελιδα που πρέπει, χωρίς συνδέσεις πινάκων κλπ.

 

Δεν ξέρω αν ήμουν κατανοητός σε αυτά που έγραψα... αν ναι, μήπως τελικά είναι περιττό το ID σε αυτά που θέλω να κάνω?

Δημοσ.

Καλό είναι να μην χρησιμοποιείς μια πληροφορία για primary key, εφόσον αυτή έχει σημασία στην εφαρμογή σου, ή αλλιώς το primary key πρέπει να είναι ΜΟΝΟ primary key. Αυτός ο κανόνας είναι χρήσιμος κυρίως σε σενάρια όπου δεδομένα μεταφέρονται από μία βάση δεδομένων κ εισάγονται σε μία άλλη βάση δεδομένων, όπου το primary key μιας εγγραφής ενδέχεται να χρειαστεί να αλλάξει.

 

Άρα καλό είναι να κρατήσεις το primary key σαν integer και auto increment, και αν θέλεις να έχεις τίτλο σελίδας που να είναι μοναδικός προσθέτεις έναν επιπλέον περιορισμό.

 

Θα έλεγα να ακολουθήσεις τη δομή που πρότεινε ο zinas για το url. Θα υπάρχει το id και το τίτλος της σελίδας. Έτσι κερδίζεις το ότι δεν χρειάζεται να ψάξεις μία εγγραφή με βάση τον τίτλο αλλά με βάση το integer id. Έχεις λοιπόν πολύ πιο γρήγορο select (το index σε integer πεδία είναι πολύ πιο αποδοτικό) και το url παραμένει SEO friendly.

 

Edit: Οι συσχετίσεις θα πρέπει να γίνονται πάντα με το primary key, όποιο κ αν είναι αυτό. Οτιδήποτε άλλο, θα σε οδηγήσει σε μη συνεπή δεδομένα, γιατί απλά θα αναγκαστείς να εφαρμόσεις τις συσχετίσεις από την εφαρμογή σου κ είναι πιθανό (σχεδόν σίγουρο) κάτι να σου ξεφύγει.

Δημοσ.

Είναι καλή η πρόταση του zinas. Στην περίπτωση, όμως, που δε θέλουμε να φαίνεται το id στο url? Δηλαδή όλες οι σελίδες να είναι της μορφής http://www.domain.gr/page_name, όπου το page_name είναι μοναδικό? Τι θα πρότεινες?

Δημοσ.

Σε αυτήν την περίπτωση, θα έκανα το SELECT με βάση το title πεδίο που είναι varchar, όμως θα κρατούσα το id σαν primary key, για λόγους performance, ειδικά αν υπάρχουν πολλά foreign key references. Τότε θα είχα ανάγκη να κάνω διάφορα joins, όπου πάλι το integer πεδίο προσφέρεται για ταχύτητα.

 

Θα έφτιαχνα δύο indexes ένα για το id και ένα για το title. Βέβαια, επειδή το title είναι varchar, το index pου θα προκύψει θα είναι πολύ μεγάλο κ θα θέλει πολύ πιο συχνά rebuild.

 

Επίσης, γιατί να υποχρεώσεις τον χρήστη να δώσει τίτλο για τη σελίδα; Μπορεί για κάποιον λόγο να μην θέλει να βάλει κάποιο τίτλο, αλλά να θέλει να δημοσιεύσει στο site του τη σελίδα αυτή. (Εδώ ισχύει ο κανόνας: το primary key πρέπει να είναι ΜΟΝΟ primary key)

 

Επειδή έχει τύχει να χρειαστεί να κάνω μία τέτοια προσέγγιση, αυτό που έκανα είναι να ψάχνω το id της σελίδας με βάση τον τίτλο κ μετά να τρέχει η υπόλοιπη σελίδα με βάση το id. Έφτιαξα κ ένα απλό σύστημα cache, έτσι ώστε να μην χρειάζεται να ρωτάω συνέχεια για το id μίας σελίδας.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...