Ερώτηση για mysql - php
Giorgos Keramidas
keramida at ceid.upatras.gr
Wed Dec 16 18:06:53 EET 2009
On Wed, 16 Dec 2009 16:59:02 +0200, panagiotis takis_rs <takispadaz at hotmail.com> wrote:
> Καλησπέρα!
> Έστω ότι θέλουμε να δημιουργήσουμε μια σελίδα όπως π.χ η imdb.com
> Έχουμε τους παρακάτω πίνακες...
>
> movies
> fields: id | title | actors
>
> Παράδειγμα εγγραφής id=1, title=The movie, actors=takis texas,maria
> mariou,petros petrou
Αν το 'actors' field σε αυτό το table είναι string, χάσατε, το lookup σε
αυτό το string δεν εκμεταλλεύεται το indexing της database engine.
> Actors
> fields: id | name | DateOfBirth | Biography
>
> Παράδειγμα εγγραφής id=5, name=takis texas, DateOfBirth=13/6/1977,
> Biography=mplamplampla
>
> Εστω τώρα ότι κάνουμε ένα select στα περιεχόμενα που πίνακα movies για
> να εμφανίσουμε τα περιεχόμενα μιας ταινίας. Επίσης επιθυμούμε οι
> ηθοποιοί που υπάρχουν στον πίνακα actors να εμφανίζονται με
> συνδεσμό. Ο συνδεσμός αυτός θα παραπέμπει σε μια αλλη σελίδα όπου θα
> περιλαμβάνονται στοιχεία για τον ηθοποιό( το select εδώ θα γίνεται
> συμφωνα με το id του ηθοποιού).
>
> Η ερώτηση μου τώρα είναι πώς μπορούμε να δημιουργήσουμε τον σύνδεσμο
> για κάθε ηθοποιό που υπάρχει ως εγγραφή στον πίνακα actors; Δηλαδή πως
> μπορούμε κατά το select from movies να σπάσουμε το πεδίο actors και
> για κάθε actor που υπάρχει στον πίνακα actors να τραβήξουμε το id;
>
> Μια προφανή λύση είναι να κάνουμε τόσα select στον πινακα actors όσα
> και οι ηθοποιοί της ταινίας. Θα είναι πολύ επώδυνο ωστόσο για τον
> server.
>
> Επίσης δεν μπορουμε να κρατάμε id ηθοποιών στον πίνακα movies καθώς
> δεν θα υπάρχουν όλοι οι ηθοποιοί στον πίνακα actors αλλά και θα
> γινεται προσθήκη ηθοποιών κάθε τόσο.
Προφανώς και _μπορείς_ να προσθέσεις εκ των υστέρων ηθοποιούς σε ένα
movie, αρκεί να έχεις σχεδιάσει "καλά" το db schema σου.
> Μια διαφορετική υλοποίηση θα ήταν να κρατήσουμε τους ηθοποιούς της
> κάθε ταινίας σε διαφορετικό πίνακα π.χ actors_of_movie
> fields: id | actor
>
> ***movies.id=actors_of_movie.id
Αυτός ο πίνακας υλοποιεί μια "σχέση" (relation). Πρόσεξε τώρα: οι πιο
γνωστές βάσεις που χρησιμοποιούνται σήμερα λέγονται "relational", είναι
πολύ σημαντικό hint.
ΑΚΡΙΒΩΣ για τέτοιου είδους συσχετίσεις μεταξύ αντικειμένων είναι που
έχουν φτιαχτεί και γίνει optimize τα database engines.
> Παράδειγμα
> 1 - takis texas
> 1 - maria mariou
> 1 - petros petrou
>
> Όποτε με ενα join με τον πίνακα actors θα είναι πιο απλά τα πράγματα.
>
> Σε αυτή την περιπτωση όμως, δεδομένου ότι κάθε ταινία έχει 20
> ηθοποιούς, και έστω οτι η βάση μας θα κρατήσει 4000 ταινίες δεν
> μακραίνει πολύ ο πίνακας actors_of_movie;
Δε θά 'πρεπε να σε ανησυχεί τόσο πολύ το μέγεθος του πίνακα. Αν τελικά
ανακαλύψεις (*αφού* κάνεις μετρήσεις κι όχι μαντεύοντας) ότι όντως το
μέγεθος του πίνακα παίζει ρόλο και σε καθυστερεί για το data set που
έχεις, σκέψου ότι μπορείς να υλοποιήσεις 2-level indexing για τα
δεδομένα ενός movie:
.--------------------. .----------------.
| movie_actor_bucket | | movie_actor_1 |
+--------------------+ +----------------+
|movie | actor_table | | movie | actor |
| 1 | 1 | -------> | 1 | 12 |
| 2 | 1 | -------> | 2 | 27 |
| 3 | 2 | -----. `-------+--------'
| | | |
/ ... / ... / | .----------------.
| | | | | movie_actor_2 |
| 7891 | 10 | --. `-> +----------------+
`------+-------------' | | movie | actor |
| | 3 | 9 |
| | 3 | 12 |
| `-------+--------'
|
| ...
/
: .-----------------.
/ | movie_actor_10 |
| +-----------------+
`----> | movie | actor |
| 7891 | 9 |
`-------+---------'
Πριν αρχίσεις τέτοιες "πονηριές" όμως, κάνε την ΑΠΛΗ λύση με ένα πίνακα
για 'movies', ένα για 'actors', κι ένα MxN relation πίνακα που εύκολα
και γρήγορα αντιστοιχεί ηθοποιούς σε ταινίες.
More information about the Linux-greek-users
mailing list