<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
<br><br>&gt; From: keramida@ceid.upatras.gr<br>&gt; To: takispadaz@hotmail.com<br>&gt; CC: linux-greek-users@lists.hellug.gr<br>&gt; Subject: Re: Ερώτηση για mysql - php<br>&gt; Date: Wed, 16 Dec 2009 18:06:53 +0200<br>&gt; <br>&gt; On Wed, 16 Dec 2009 16:59:02 +0200, panagiotis takis_rs &lt;takispadaz@hotmail.com&gt; wrote:<br>&gt; &gt; Καλησπέρα!<br>&gt; &gt; Έστω ότι θέλουμε να δημιουργήσουμε μια σελίδα όπως π.χ η imdb.com<br>&gt; &gt; Έχουμε τους παρακάτω πίνακες...<br>&gt; &gt;<br>&gt; &gt; movies<br>&gt; &gt; fields: id | title | actors<br>&gt; &gt;<br>&gt; &gt; Παράδειγμα εγγραφής id=1, title=The movie, actors=takis texas,maria<br>&gt; &gt; mariou,petros petrou<br>&gt; <br>&gt; Αν το 'actors' field σε αυτό το table είναι string, χάσατε, το lookup σε<br>&gt; αυτό το string δεν εκμεταλλεύεται το indexing της database engine.<br>&gt; <br>&gt; <br>&gt; &gt; Actors<br>&gt; &gt; fields: id | name | DateOfBirth | Biography<br>&gt; &gt;<br>&gt; &gt; Παράδειγμα εγγραφής id=5, name=takis texas, DateOfBirth=13/6/1977,<br>&gt; &gt;   Biography=mplamplampla<br>&gt; &gt;<br>&gt; &gt; Εστω τώρα ότι κάνουμε ένα select στα περιεχόμενα που πίνακα movies για<br>&gt; &gt; να εμφανίσουμε τα περιεχόμενα μιας ταινίας. Επίσης επιθυμούμε οι<br>&gt; &gt; ηθοποιοί που υπάρχουν στον πίνακα actors να εμφανίζονται με<br>&gt; &gt; συνδεσμό. Ο συνδεσμός αυτός θα παραπέμπει σε μια αλλη σελίδα όπου θα<br>&gt; &gt; περιλαμβάνονται στοιχεία για τον ηθοποιό( το select εδώ θα γίνεται<br>&gt; &gt; συμφωνα με το id του ηθοποιού).<br>&gt; &gt;<br>&gt; &gt; Η ερώτηση μου τώρα είναι πώς μπορούμε να δημιουργήσουμε τον σύνδεσμο<br>&gt; &gt; για κάθε ηθοποιό που υπάρχει ως εγγραφή στον πίνακα actors; Δηλαδή πως<br>&gt; &gt; μπορούμε κατά το select from movies να σπάσουμε το πεδίο actors και<br>&gt; &gt; για κάθε actor που υπάρχει στον πίνακα actors να τραβήξουμε το id;<br>&gt; &gt;<br>&gt; &gt; Μια προφανή λύση είναι να κάνουμε τόσα select στον πινακα actors όσα<br>&gt; &gt; και οι ηθοποιοί της ταινίας. Θα είναι πολύ επώδυνο ωστόσο για τον<br>&gt; &gt; server.<br>&gt; &gt;<br>&gt; &gt; Επίσης δεν μπορουμε να κρατάμε id ηθοποιών στον πίνακα movies καθώς<br>&gt; &gt; δεν θα υπάρχουν όλοι οι ηθοποιοί στον πίνακα actors αλλά και θα<br>&gt; &gt; γινεται προσθήκη ηθοποιών κάθε τόσο.<br>&gt; <br>&gt; Προφανώς και _μπορείς_ να προσθέσεις εκ των υστέρων ηθοποιούς σε ένα<br>&gt; movie, αρκεί να έχεις σχεδιάσει "καλά" το db schema σου.<br>&gt; <br>&gt; &gt; Μια διαφορετική υλοποίηση θα ήταν να κρατήσουμε τους ηθοποιούς της<br>&gt; &gt; κάθε ταινίας σε διαφορετικό πίνακα π.χ actors_of_movie<br>&gt; &gt; fields: id | actor<br>&gt; &gt;<br>&gt; &gt; ***movies.id=actors_of_movie.id<br>&gt; <br>&gt; Αυτός ο πίνακας υλοποιεί μια "σχέση" (relation).  Πρόσεξε τώρα: οι πιο<br>&gt; γνωστές βάσεις που χρησιμοποιούνται σήμερα λέγονται "relational", είναι<br>&gt; πολύ σημαντικό hint.<br>&gt; <br>&gt; ΑΚΡΙΒΩΣ για τέτοιου είδους συσχετίσεις μεταξύ αντικειμένων είναι που<br>&gt; έχουν φτιαχτεί και γίνει optimize τα database engines.<br>&gt; <br>&gt; &gt; Παράδειγμα<br>&gt; &gt; 1 - takis texas<br>&gt; &gt; 1 - maria mariou<br>&gt; &gt; 1 - petros petrou<br>&gt; &gt;<br>&gt; &gt; Όποτε με ενα join με τον πίνακα actors θα είναι πιο απλά τα πράγματα.<br>&gt; &gt;<br>&gt; &gt; Σε αυτή την περιπτωση όμως, δεδομένου ότι κάθε ταινία έχει 20<br>&gt; &gt; ηθοποιούς, και έστω οτι η βάση μας θα κρατήσει 4000 ταινίες δεν<br>&gt; &gt; μακραίνει πολύ ο πίνακας actors_of_movie;<br>&gt; <br>&gt; Δε θά 'πρεπε να σε ανησυχεί τόσο πολύ το μέγεθος του πίνακα.  Αν τελικά<br>&gt; ανακαλύψεις (*αφού* κάνεις μετρήσεις κι όχι μαντεύοντας) ότι όντως το<br>&gt; μέγεθος του πίνακα παίζει ρόλο και σε καθυστερεί για το data set που<br>&gt; έχεις, σκέψου ότι μπορείς να υλοποιήσεις 2-level indexing για τα<br>&gt; δεδομένα ενός movie:<br>&gt; <br>&gt;    .--------------------.           .----------------.<br>&gt;    | movie_actor_bucket |           |  movie_actor_1 |<br>&gt;    +--------------------+           +----------------+<br>&gt;    |movie | actor_table |           | movie | actor  |<br>&gt;    |   1  |      1      | -------&gt;  |   1   |  12    |<br>&gt;    |   2  |      1      | -------&gt;  |   2   |  27    |<br>&gt;    |   3  |      2      | -----.    `-------+--------'<br>&gt;    |      |             |      |<br>&gt;    /  ... /    ...      /      |    .----------------.<br>&gt;    |      |             |      |    | movie_actor_2  |<br>&gt;    | 7891 |     10      | --.  `-&gt;  +----------------+<br>&gt;    `------+-------------'   |       | movie | actor  |<br>&gt;                             |       |   3   |   9    |<br>&gt;                             |       |   3   |  12    |<br>&gt;                             |       `-------+--------'<br>&gt;                             |<br>&gt;                             |              ...<br>&gt;                             /<br>&gt;                             :       .-----------------.<br>&gt;                             /       | movie_actor_10  |<br>&gt;                             |       +-----------------+<br>&gt;                             `----&gt;  | movie | actor   |<br>&gt;                                     |  7891 |   9     |<br>&gt;                                     `-------+---------'<br>&gt; <br>&gt; Πριν αρχίσεις τέτοιες "πονηριές" όμως, κάνε την ΑΠΛΗ λύση με ένα πίνακα<br>&gt; για 'movies', ένα για 'actors', κι ένα MxN relation πίνακα που εύκολα<br>&gt; και γρήγορα αντιστοιχεί ηθοποιούς σε ταινίες.<br>&gt; <br><br>Ευχαριστώ πολύ για τις απαντήσεις σου. Οσο για το τελευταίο που είπες '2-level indexing', δεν το ξέρω, έχω μείνει στα βασικά, θα το κοιτάξω πάντως.<br>Θα προτιμήσω λοιπόν την λύση με τον επιπλεόν πίνακα συσχέτισης που είναι και πιο απλή.<br>Ο μονος λόγος που το άρχισα αυτό είναι γιατί έψαχνα μια πιο απλή λύση, δεδομένου ότι κάθε ταινία έχει πολλαπλούς ηθοποιούς, σκηνοθέτες, σεναριογράφους, παραγωγούς, genres και μακραίνει αρκετά το πράγμα από πλευράς πινάκων.<br><br>Πανος<br>                                               <br /><hr />Windows Live:  <a href='http://www.microsoft.com/middleeast/windows/windowslive/see-it-in-action/social-network-basics.aspx?ocid=PID23461::T:WLMTAGL:ON:WL:en-xm:SI_SB_3:092010' target='_new'>Friends get your Flickr, Yelp, and Digg updates when they e-mail you.</a></body>
</html>