Παναγιώτη, η αποθήκευση εικόνων σε βάση, ειδικά σε σενάρια web sites είναι μια πρακτική η οποία δεν θα ενθάρρυνα. Πρώτον, γιατί βάσει των πλάνων φιλοξενίας πολλές φορές χρησιμοποιούνται express εκδόσεις των SQL Servers με περιορισμούς ως προς το μέγεθος της βάσης, η οποία μπορεί να μεγαλώσει πάρα πολύ αν αποθηκεύονται binary data σε αυτην. Δεύτερον, γιατί με file-based αποθήκευση διευκολύνεται πολύ η χρήση on-the-fly resizers (imageresizing.net, imagegen κλπ).
Σχετικά με το ερώτημα του συναδέλφου: Θα πρέπει να κρατάς το schema της database όσο γίνεται σταθερότερο. Το να φτιάχνεις ένα καινούριο πίνακα, πανομοιότυπο με τους προηγούμενους, για κάθε κατηγορία, δεν είναι αποτελεσματικό. Τι θα γίνει αν θέλεις να εμφανίσεις όλες τις εικόνες που ανήκουν σε κατηγορίες που θα έχει επιλέξει κάθε φορά ο χρήστης; Τι θα γίνει αν μια εικόνα ανήκει σε παραπάνω από μία κατηγορίες;
Η καλύτερη προσέγγιση που μπορείς να κάνεις είναι να φτιάξεις ένα πίνακα εικόνων και ένα πίνακα κατηγοριών. Και οι δύο πρέπει να έχουν ένα primary key (id) που θα χαρακτηρίζει μοναδικά κάθε εγγραφή. Επειτα, θα πρέπει να δημιουργήσεις έναν ενδιάμεσο πίνακα συσχέτισης (junction table) όπου κάθε εγγραφή του θα περιέχει το id της εικόνας και το id της κατηγορίας που ανήκει αυτή. Με αυτό τον τρόπο, καλύπτεις όλα τα σενάρια: Μπορείς να ορίσεις όσες κατηγορίες θέλεις, μπορείς να αντιστοιχείς μια εικόνα σε μια ή περισσότερες κατηγορίες (κάθε αντιστοίχιση θα είναι μια εγγραφή στον ενδιάμεσο πίνακα), μπορείς ακόμα και να έχεις εικόνες που δεν ανήκουν σε κατηγορία.
Μια πιό απλή προσέγγιση, η οποία όμως σε περιορίζει στο ότι θα πρέπει να έχεις μόνο μία κατηγορία στην οποία να ανήκει η εικόνα, είναι να πας με δύο πίνακες: Ενα πίνακα κατηγοριών και ένα πίνακα εικόνων όπου σε καθε εγγραφή ένα πεδίο θα περιέχει το id της κατηγορίας στην οποία ανήκει η εικόνα.
Σωτήρης Φιλιππίδης
DotSee Web Services