Ξ�Ο�Ο�Ο�Ξ·Ο&#655Ξ�Ο�Ο�Ο�Ξ·Ο�Ξ· Ξ³ΞΉΞ± 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