Ξ�Ο�Ο�Ο�Ξ·ΟʏΞ�Ο�Ο�Ο�Ξ·Ο�Ξ· Ξ³ΞΉΞ± mysql - php
rouvas at di.uoa.gr
rouvas at di.uoa.gr
Wed Dec 16 19:26:22 EET 2009
Giorgos Keramidas wrote:
> 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;
Συμφωνώ με τους προλαλήσαντες και να προσθέσω ότι 4000*20=80000 που
σημαίνει άνευ σημασίας όγκος. Ακόμα και αν οι εγγραφές γίνουν 8000000000
με indexing στο id και χρήση του, δεν υπάρχει λόγος ανησυχίας.
Συμβουλή:
Ποτέ μα *ποτέ* μα εντελώς ΠΟΤΕ μην βασίζεσαι στα strings για συσχετίσεις
μεταξύ οποιονδήποτε σχέσεων.
Επέκταση της Συμβουλής:
Εξαιρούνται οι περιπτώσεις που δεν μπορείς να κάνεις αλλιώς, γιατί
παρέλαβες ηλίθιο σχεδιασμό.
>
> Δε θά 'πρεπε να σε ανησυχεί τόσο πολύ το μέγεθος του πίνακα. Αν τελικά
> ανακαλύψεις (*αφού* κάνεις μετρήσεις κι όχι μαντεύοντας) ότι όντως το
> μέγεθος του πίνακα παίζει ρόλο και σε καθυστερεί για το 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 |
> `-------+---------'
>
Ρε συ Κεραμίδα, κι άλλες φορές έχει απαντήσει με ASCII (ch)arts.
Πως διάλο τα κάνεις;
Έχεις εργαλείο διάφορο του vi που τα σχεδιάζεις και τα κάνει export σε
ASCII art;
-Στάθης
> Πριν αρχίσεις τέτοιες "πονηριές" όμως, κάνε την ΑΠΛΗ λύση με ένα πίνακα
> για 'movies', ένα για 'actors', κι ένα MxN relation πίνακα που εύκολα
> και γρήγορα αντιστοιχεί ηθοποιούς σε ταινίες.
>
>
> --
> linux-greek-users mailing list -- http://lists.hellug.gr
More information about the Linux-greek-users
mailing list