digimyth Δημοσ. 1 Δεκεμβρίου 2010 Δημοσ. 1 Δεκεμβρίου 2010 Χαιρετώ. Είμαι νέος (κοινώς n00bας-σχεδόν) στη κατασκευή ιστοσελίδων και θα ήθελα να ρωτήσω σχετικά με την οργάνωση της βάσης δεδομένων μου, δεδομένου ότι δε θέλω να χρησιμοποιήσω CMS. Αυτό τον καιρό φτιάχνω μια ιστοσελίδα (αρχικά στάδια) αλλά δεν έχω αποφασίσει για τη δομή της βάσης. Οπότε θέλω να μου δώσετε καμιά συμβουλή γενικά πάνω στο θέμα της βάσης και την οργάνωσή της. Επίσης σκεφτόμουν αν θα ήταν καλύτερο να σπάσω τη βάση δεδομένων σε παραπάνω από 1. Δηλαδή 1 βάση που θα περιέχει πχ όλους τους χρήστες, μια άλλη που θα περιέχει πχ μεταφράσεις της σελίδας σε άλλες γλώσσες και άλλη μια που θα περιέχει πχ τα άρθρα της σελίδας κλπ... Αναρωτιέμαι αν αυτή είναι καλή τεχνική ή όχι... Ευχαριστώ για το χρόνο σας και όποια βοήθεια.
_tasos Δημοσ. 1 Δεκεμβρίου 2010 Δημοσ. 1 Δεκεμβρίου 2010 Δεν χρειάζονται πολλές βάσεις, η μία είναι αρκετή. Από εκεί και πέρα ένας πολύ χοντρικός κανόνας είναι να φτιάξεις έναν πίνακα για κάθε βασικό αντικείμενο της εφαρμογής σου. Θα κάνεις CMS, άρα θα έχει π.χ. κατηγορίες, άρθρα και χρήστες. Το καθένα από αυτά θα πρέπει να είναι ένας πίνακας από μόνος του. Σε δεύτερη φάση θα κοιτάξεις να "εισάγεις" μέσα στη ΒΔ σου τις συσχετίσεις που έχουν αντικείμενα μεταξύ τους. Π.χ., κάθε άρθρο ανήκει σε μία κατηγορία άρα πρέπει να βάλεις ένα πεδίο categoryid στον πίνακα των άρθρων. Ίσως οι συσχετίσεις να είναι ξεχωριστός πίνακας, π.χ. αν θέλεις ένα άρθρο σου να εμφανίζεται σε περισσότερες από μία κατηγορίες. Εδώ θα έχεις έναν πίνακα (articleid, categoryid) που θα έχει τη σχετική πληροφορία (ποιο άρθρο σε ποια κατηγορία). Άρα οι συσχετίσεις σου θα βρίσκονται είτε σαν ένα επιπλέον πεδίο σε κάποιον πίνακα ή θα είναι ένας νέος πίνακας που θα κρατάει όλα τα ταιριάσματα. [*]Θα πρέπει να φροντίσεις να βάλεις τα ξένα κλειδιά στη βάση σου. Π.χ. ο συγγραφέας ενός άρθρου είναι μία πληροφορία που υπάρχει στο πεδίο userid του πίνακα των άρθρων. Αυτό το πεδίο είναι ξένο κλειδί του πίνακα users. Για αυτό το πεδίο θα πρέπει να βάλεις ένα foreign key reference για να διατηρήσεις σωστά τα δεδομένα σου. [*]Τέλος θα πρέπει να βάλεις και τα κατάλληλα indexes για να πετύχεις καλύτερο performance. Αυτά σε πολύ γενικές γραμμές, για ότι θέλεις ρώτα να το συζητήσουμε παραπάνω.
digimyth Δημοσ. 2 Δεκεμβρίου 2010 Μέλος Δημοσ. 2 Δεκεμβρίου 2010 Δεν χρειάζονται πολλές βάσεις, η μία είναι αρκετή. Από εκεί και πέρα ένας πολύ χοντρικός κανόνας είναι να φτιάξεις έναν πίνακα για κάθε βασικό αντικείμενο της εφαρμογής σου. Θα κάνεις CMS, άρα θα έχει π.χ. κατηγορίες, άρθρα και χρήστες. Το καθένα από αυτά θα πρέπει να είναι ένας πίνακας από μόνος του. Σε δεύτερη φάση θα κοιτάξεις να "εισάγεις" μέσα στη ΒΔ σου τις συσχετίσεις που έχουν αντικείμενα μεταξύ τους. Π.χ., κάθε άρθρο ανήκει σε μία κατηγορία άρα πρέπει να βάλεις ένα πεδίο categoryid στον πίνακα των άρθρων. Ίσως οι συσχετίσεις να είναι ξεχωριστός πίνακας, π.χ. αν θέλεις ένα άρθρο σου να εμφανίζεται σε περισσότερες από μία κατηγορίες. Εδώ θα έχεις έναν πίνακα (articleid, categoryid) που θα έχει τη σχετική πληροφορία (ποιο άρθρο σε ποια κατηγορία). Άρα οι συσχετίσεις σου θα βρίσκονται είτε σαν ένα επιπλέον πεδίο σε κάποιον πίνακα ή θα είναι ένας νέος πίνακας που θα κρατάει όλα τα ταιριάσματα. [*]Θα πρέπει να φροντίσεις να βάλεις τα ξένα κλειδιά στη βάση σου. Π.χ. ο συγγραφέας ενός άρθρου είναι μία πληροφορία που υπάρχει στο πεδίο userid του πίνακα των άρθρων. Αυτό το πεδίο είναι ξένο κλειδί του πίνακα users. Για αυτό το πεδίο θα πρέπει να βάλεις ένα foreign key reference για να διατηρήσεις σωστά τα δεδομένα σου. [*]Τέλος θα πρέπει να βάλεις και τα κατάλληλα indexes για να πετύχεις καλύτερο performance. Αυτά σε πολύ γενικές γραμμές, για ότι θέλεις ρώτα να το συζητήσουμε παραπάνω. Ναι, όταν είπα CMS δεν το εννοούσα με την πραγματική σημασία της λέξης αλλά ως CMS application τύπου joomla... Ευχαριστώ για την απάντηση αλλά θα ήθελα σε παρακαλώ να μου δώσεις ένα παράδειγμα για τον όρο αντικείμενο. Δηλαδή ως τι χαρακτηρίζεται το αντικείμενο; (για να μπορέσω να κάνω τη σύνδεση στο κεφάλι μου ) Επίσης θα ήθελα να ρωτήσω τι αρνητικό θα υπήρχε και τι θετικό (αν) στο να σπάσω τη βάση δεδομένων; Έτσι όπως το σκέφτομαι θα μπορούσα να φτιάξω μια βάση η οποία θα περιέχει μόνο μεταφράσεις σε διάφορες γλώσσες μια άλλη που κρατάει διάφορα στοιχεία χρηστών - στατιστικά και μια άλλη που θα κρατάει πχ τα άρθρα κλπ. Αυτό θα είχε τα εξής πλεονεκτήματα κατά τη γνώμη μου: 1) Μεγαλύτερη προστασία από μη εξουσιοδοτημένη πρόσβαση (κοινώς hacking) δεδομένου ότι ο επίδοξος hacker θα είχε στη διάθεσή του μόνο μία βάση με συγκεκριμένα στοιχεία χωρίς να ξέρει τι γίνεται και στις υπόλοιπες. Βέβαια αυτό συνεπάγεται να μην υπάρχει κάποιος super admin που να μπορεί να εκτελέσει όλες τις αρμοδιότητες μόνος του (πχ drop, insert, delete...). 2) Μικρότερος όγκος κάθε βάσης άρα πιο εύκολο backup, ίσως πιο εύκολη διαχείριση και πιο εύκολη μεταφερσιμότητα πχ σε άλλο host. 3) Και ως τελευταίο πιστεύω ότι θα ήταν πιο οργανωτικό να σπάσω τη βάση όπως χωρίζουμε τα αρχεία σε φακέλους. Δηλαδή μου φαίνεται ότι αν τα βάλω όλα σε μια βάση θα είναι σα να βάζω όλα τα αρχεία σε ένα φάκελο... Η αλήθεια είναι βέβαια ότι μπορεί να λέω και λ@λ@κίες γιατί δεν έχω διαβάσει και κανά βιβλίο σχετικά με δομή-σχεδίαση βάσεων δεδομένων απλά ξέρω μόνο τα βασικά όπως να τη δημιουργώ και να κάνω queries. *Το όλο εγχείρημα το κάνω γιατί θέλω να δημιουργήσω τη σελίδα από το μηδέν χωρίς να πάω στις εύκολες λύσεις τύπου joomla.
_tasos Δημοσ. 2 Δεκεμβρίου 2010 Δημοσ. 2 Δεκεμβρίου 2010 Πήρα για παράδειγμα ένα CMS απλά για να έχω κάπου να αναφέρομαι. Όταν λέω αντικείμενο, εννοώ ένα κύριο στοιχείο της ΒΔ μου. Για κάθε εφαρμογή τα αντικείμενα είναι διαφορετικά. Π..χ για ένα eshop θα μπορούσε να είναι τα προϊόντα, τα μέλη/πελάτες, οι παραγγελίες. Όχι όμως ποια είναι τα προϊόντα (π.χ. το προϊόν #34432 με ποσότητα 3) σε μια παραγγελία. Σχετικά με τις πολλές ΒΔ, ο μόνο λόγος για να έχεις πολλές ΒΔ είναι το θέμα της απόδοσης. Αλλά έχει τα αρνητικά του, π.χ. ανάμεσα στις δύο ΒΔ δεν θα μπορέσεις να κάνεις JOIN ή κάποιο stored procedure για να πάρεις τα δεδομένα που θέλεις. Θα πρέπει δλδ τα δεδομένα που θα κάτσουν σε διαφορετικές ΒΔ να είναι εντελώς ξένα μεταξύ τους.Έχω δει να χωρίζονται τα data σε ΒΔ μόνο σε περιπτώσεις που τα data γίνονται archive, π.χ. οι πωλήσεις του προηγούμενου έτους. Μπορείς να φτιάξεις users και να δώσεις τα κατάλληλα δικαιώματα έτσι ώστε να μην μπορεί κάποιος να σου κάνει DELETE ή και DROP τους πίνακες. Π.χ. τα δικαιώματα του user που θα κάνει connect από το client μέρος του site σου, να περιορίζονται σε SELECT statements. Έχεις τρόπους να προστατέψεις τα data σου. Όσο για το backup, θα μπορούσες να κάνεις partial backup δλδ μερικούς πίνακες από τη ΒΔ σε καθημερινή βάση και ένα συνολικό backup κάθε εβδομάδα ή μήνα. Επίσης έχει σημασία και το DBMS που θα χρησιμοποιήσεις. Π.χ. ο SQL Server απαντάει κάποιους από τους προβληματισμούς σου. Δεν σου λέω να πας σε Sql Server αλλά κάθε DBMS έχει κάποιες επιπλέον δυνατότητες οπότε ανάλογα με το DBMS σου αποφασίζεις και το τι θα κάνεις.
digimyth Δημοσ. 2 Δεκεμβρίου 2010 Μέλος Δημοσ. 2 Δεκεμβρίου 2010 Ωραία καλώς ευχαριστώ. Έχω όμως το εξής πρόβλημα. Ξεκίνησα από το πρώτο πράγμα και βασικότερο που θα έχει η σελίδα. Τους εγγεγραμμένους χρήστες αλλά καθώς έφτιαχνα τα πεδία από το PHPMyAdmin συνάντησα επιλογές στις οποίες δε ξέρω τι να επιλέξω. Αρχικά σκέφτομαι να έχει 5 πεδία: Α/Α, username, password, email, last login με πρωτεύον κλειδί το username. Το Α/Α θέλω να το βάλω για να μετράω τους εγγεγραμμένους χρήστες. Αργότερα θα προστεθούν και άλλα. Ένα βήμα τη φορά... Θα ήθελα μια μικρή βοήθεια για τους τύπους των πεδίων και ειδικά για τα username - pass. Τις 3 πρώτες σειρές τις ξέρω. Από το προκαθορισμένο αρχίζω και ανησυχώ... Ευχαριστώ
dewn735 Δημοσ. 2 Δεκεμβρίου 2010 Δημοσ. 2 Δεκεμβρίου 2010 Η συνηθισμένη μου προσέγγιση: id -> integer / primary / unique / autonumber username -> char (20) / unique usepass -> char (50) (Θα είναι encrypted) userlevel -> integer lastip -> char (15) lastmove -> timestamp / on update CURRENT_TIMESTAMP και από κει και πέρα βλέπουμε... Ξέχασα να πω ότι όλα είναι υποχρεωτικά και κανένα προκαθορισμένο (μη τύχει και μπει κατά λάθος, ή χωρίς τιμή)
_tasos Δημοσ. 2 Δεκεμβρίου 2010 Δημοσ. 2 Δεκεμβρίου 2010 Σε πρώτη φάση ότι σου είπε ο dewn735 είναι μια χαρά. Η mysql έχει function η οποία κάνει encrypt το password οπότε δεν χρειάζεται να δυσκολευτείς για να αποθηκεύεις με ασφαλή τρόπο τους κωδικούς. Θα σου έλεγα να προσέξεις το charset και το collation των πινάκων charset: utf8 collation utf8_general_ci. Αλλιώς μπορεί να έχεις πρόβλημα με τα ελληνικά.
digimyth Δημοσ. 2 Δεκεμβρίου 2010 Μέλος Δημοσ. 2 Δεκεμβρίου 2010 Η συνηθισμένη μου προσέγγιση: id -> integer / primary / unique / autonumber username -> char (20) / unique usepass -> char (50) (Θα είναι encrypted) userlevel -> integer lastip -> char (15) lastmove -> timestamp / on update CURRENT_TIMESTAMP και από κει και πέρα βλέπουμε... Ξέχασα να πω ότι όλα είναι υποχρεωτικά και κανένα προκαθορισμένο (μη τύχει και μπει κατά λάθος, ή χωρίς τιμή) Το "lastip" τι ακριβώς είναι; Έκανα μια δοκιμαστική εισαγωγή νέου χρήστη και είδα την επιλογή "encrypt" αλλά πως μπορώ να την κάνω μόνιμη; Δηλαδή στο συγκεκριμένο πεδίο να τρέχει εξορισμού το enrypt; Πάντως βρήκα ότι ακόμα και έτσι να μην το κάνω μπορώ να χρησιμοποιήσω τις συναρτήσεις md5() και SHA1(). Επίσης στο userlevel δε θα μπορούσε να οριστεί μια default τιμή πχ 1 για απλούς χρήστες; Thanks
jms Δημοσ. 3 Δεκεμβρίου 2010 Δημοσ. 3 Δεκεμβρίου 2010 Το "lastip" τι ακριβώς είναι; Έκανα μια δοκιμαστική εισαγωγή νέου χρήστη και είδα την επιλογή "encrypt" αλλά πως μπορώ να την κάνω μόνιμη; Δηλαδή στο συγκεκριμένο πεδίο να τρέχει εξορισμού το enrypt; Πάντως βρήκα ότι ακόμα και έτσι να μην το κάνω μπορώ να χρησιμοποιήσω τις συναρτήσεις md5() και SHA1(). Επίσης στο userlevel δε θα μπορούσε να οριστεί μια default τιμή πχ 1 για απλούς χρήστες; Thanks lastip-> η ip από την οποία έκανε τελευταία login ο χρήστης για το 2ο δεν καταλαβαίνω ακριβώς τι ζητάς, αλλά των κωδικό εγώ τον "σενιάρω" με md5 και λίγο αλατάκι ("salt"). Κάποιος ποιο ειδικός σε θέματα ασφάλειας ας δώσει τα φώτα του Για το 3ο φυσικά και θα μπορούσε...
ΠάρηςΓ Δημοσ. 3 Δεκεμβρίου 2010 Δημοσ. 3 Δεκεμβρίου 2010 Λεω τωρα περι ip για ipv6 υπαρχει προβλεψη ;
digimyth Δημοσ. 3 Δεκεμβρίου 2010 Μέλος Δημοσ. 3 Δεκεμβρίου 2010 lastip-> η ip από την οποία έκανε τελευταία login ο χρήστης για το 2ο δεν καταλαβαίνω ακριβώς τι ζητάς, αλλά των κωδικό εγώ τον "σενιάρω" με md5 και λίγο αλατάκι ("salt"). Κάποιος ποιο ειδικός σε θέματα ασφάλειας ας δώσει τα φώτα του Για το 3ο φυσικά και θα μπορούσε... Στο PHPMyAdmin όταν θες να βάλεις χειροκίνητα με γραφικό τρόπο μια τιμή σε ένα πεδίο του πίνακα (πχ ένα νέο χρήστη) από την καρτέλα "Εισαγωγή" υπάρχει και ένα πεδίο που είναι ορισμένο από τη MySQL και λέγεται "Έλεγχος". Από εκεί έχεις τη δυνατότητα όταν βάζεις το password να επιλέξεις το "Encrypt" και ο κωδικός αποθηκεύεται κρυπτογραφημένος. Αυτό όμως πρέπει να το επιλέγεις κάθε φορά. Εγώ ρώτησα αν μπορεί να γίνει μόνιμα επιλεγμένο ή αν μπορώ να το κάνω από κώδικα και πως... Τι χρησιμότητα θα μπορούσε να έχει να καταγράφω την IP κάποιου; Ένας κακόβουλος θα μπορούσε να συνδεθεί από proxy...
_tasos Δημοσ. 4 Δεκεμβρίου 2010 Δημοσ. 4 Δεκεμβρίου 2010 Τι χρησιμότητα θα μπορούσε να έχει να καταγράφω την IP κάποιου; Ένας κακόβουλος θα μπορούσε να συνδεθεί από proxy... Π.χ. αν δύο χρήστες σου είναι με την ίδια IP θα μπορούσε να είναι το ίδιο άτομο. Είναι κάτι που δεν θέλεις να συμβαίνει. Έχει νόημα να κρατάς ένα log με το πότε κάποιο account κάνει login, με ποια IP, πόση ώρα είναι στο site. Αυτό το log ίσως να σου φανεί χρήσιμο σε περίπτωση που προκύψει κάποιο νομικό θέμα...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.