- Home
- Categorie
- Coding e Sistemistica
- PHP
- Database 1:m. Come svilupparlo
-
Intanto grazie per la risposta =D
ma sono ancora un pò titubante su certe cose:- la query di join tra le tabelle la vado a creare nel database o la invio da php?
- Nella terza tabella che dici di creare per attuare la relazione, quale id primario metto tra i 2? Quello del portfolio? delle tecnologie? un terzo campo? Nessuno? =O
-
@karedas said:
- la query di join tra le tabelle la vado a creare nel database o la invio da php?
Le relazioni in MySQL sono definite a livello di query, non sono immagazzinate nel database (tipo Access, per intenderci) quindi i JOIN vanno inseriti in ogni query quando servono.
@karedas said:
- Nella terza tabella che dici di creare per attuare la relazione, quale id primario metto tra i 2? Quello del portfolio? delle tecnologie? un terzo campo? Nessuno? =O
Nessun primario, crea un unico indice su entrambi i campi per migliori performance, ma funziona anche senza.
Ciao
Bruno
-
se la relazione è Molti a Molti devi creare una tabella intermedia in cui mettere come come chiavi primarie, le stesse chiavi primarie delle due tabelle in relazione. In questa tabella intermedia appena creata dovresti mettere, se presenti, tutte quelle informazioni che sono comuni ad entrambe le tabelle in relazione come ad esempio la data di creazione etc etc.
Se invece crei una tabella 1:M devi creare la tabella che ha relazione 1,con i campi normali senza nessun riferimento di campi all'altra tabella. Invece l'altra devi aggiungere ai campi che avevi già stabilito, il campo di chiave primaria dell'altra tabella.
Spero di essere stato d'aiuto.
:);)
-
Se invece crei una tabella 1:M devi creare la tabella che ha relazione 1,con i campi normali senza nessun riferimento di campi all'altra tabella. Invece l'altra devi aggiungere ai campi che avevi già stabilito, il campo di chiave primaria dell'altra tabella.Anche in questo caso hai bisogno di una tabella intermedia, altrimenti ti ritrovi a duplicare i dati per ogni M record che fanno riferimento alla tabella 1 con conseguente incremento di spazio su disco, difficolta' di manutenzione del database e rischi di inconsistenza dovuti alla ridondanza dei dati.
Ciao
Bruno
-
Ma quindi ponendo il fatto che esistono siti con un unico nome e url ma per lo stesso sito più tecnologie, come devo realizzare la terza tabella?
Con le foreign keys? No perchè fintanto c'è da creare database normali ok, ma in mysql inciampo un pò =D
-
Ciao,
@karedas said:Ma quindi ponendo il fatto che esistono siti con un unico nome e url ma per lo stesso sito più tecnologie, come devo realizzare la terza tabella?
Con le foreign keys? No perchè fintanto c'è da creare database normali ok, ma in mysql inciampo un pò =DLe foreign keys sono supportate solo nell'InnoDB engine (meno performante) e sono usate SOLO per verificare e forzare l'integrita' dei dati, le referenze tra le tabelle vengono ancora impostate nella query usando JOIN.
Io la tabella la farei cosi':
CREATE TABLEportfolio_tecnologia
(
id_portfolio
int(10) NOT NULL default '0',
id_tecnologia
int(10) NOT NULL default '0',
PRIMARY KEY (id_portfolio
,id_tecnologia
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;Le SELECT qualcosa come
SELECT p., t. FROM portfolio_tecnologia pt
LEFT JOIN portfolio p ON pt.id_portfolio=p.id_portfolio
LEFT JOIN tecnologia t ON pt.id_tecnologia=t.id_tecnologia
WHERE ....Comunque provale in MySQLAdmin e vedi se ti ritrovi i risultati voluti (magari ci ho messo anche qualche errore, non le ho provate )
Ciao
Bruno
-
ok grazie capito!
Ah una delucidazione nel linguaggio sql. Io lo so usare a livelli basilari.
Le abbreviazioni sulla select (p.* , t.* ) e il pt ....
insomma quelli! Come funzionano in sintassi?
-
No ho provato e non è venuto ciò che volevo io, probabilmente mi sono spiegato male.
Faccio un esempio + dettagliato x farvi capire quello che voglio. Non so come strutturarlo.
Allora come abbiamo detto sopra ho questa famosa tabella "PORTFOLIO".
Ogni riga contiene un array di dati sopra citati. Tra questi ci vorrei mettere anche le tecnologie usate nella creazione del sito medesimo.Quindi come detto sempre sopra creo una seconda tabella e ci metto l'id della tecnologia e il nome (php, java, html, ecc ecc).
Adesso: siamo arrivati al punto di creare una terza tabella che crei un'integrità referenziale tra PORTFOLIO E TECNOLOGIA in modo da poter dimezzare le risorse e avere un lavoro + ordinato.
Io ho creato questa terza tabella e nel php ho inviato la query cn il Left join (scritta da bruno). Tramite:
[php]$query= 'la query di bruno';
$oggetti=connection::sendQuery($query);
while($riga=mysql_fetch_row($oggetti){
//stampa ciò che voglio richiamando ogni singolo elemento
}[/php]Allora stampare lo fa, richiamare i dati anche.
Ma è proprio in questo che nn torna quello che voglio fare!
Ad esempio se ho 1 sito (Www.sito.it) , il ciclo si ripete per ogni tecnologia presente e quindi:
(esempio 10 tecnologie nel database)
Stampa 10 volte 1 sito per 10 tecnologie presenti e poi passa al secondo!Insomma non è questo che voglio!
-
Ciao,
la query ti ha ritornato i dati di cui hai bisogno, cioe' l'associazione tra url e tecnologia. Ora e' una questione di adattare i dati a quello che vuoi fare.[php]
$query= 'la query di bruno';
$oggetti=connection::sendQuery($query);
$UrlId=-1;
while($riga=mysql_fetch_row($oggetti){
if ($UrlId!=$riga->id_portfolio) {
if ($UrlId>=0) print "\n" . $out;
$UrlId=$riga->id_portfolio;
$out='Url id =' . $riga->id_portfolio . 'Tecnologie: ';
}
$out.=$riga->nome_tecnologia . ' ';
}
print "\n" . $out;
[/php]Questo stampa (o dovrebbe stampare) una riga per url con le tecnologie appese in coda.Ciao
Bruno
-
@karedas said:
ok grazie capito!
Ah una delucidazione nel linguaggio sql. Io lo so usare a livelli basilari.
Le abbreviazioni sulla select (p.* , t.* ) e il pt ....
insomma quelli! Come funzionano in sintassi?Sono alias per il nome della tabella che precede, aiutano parecchio in leggibilita' quando hai nomi lunghi per le tabelle.
Ciao
Bruno
-
Scusa, l'esempio sopra usa mysql_fetch_row ma si riferisce ai dati come se avesse usato mysql_fetch_object (abitudine...), il while deve essere letto come
while($riga=mysql_fetch_object($oggetti){
Ciao
Bruno
-
Ciao, sono parecchio alle prime armi, quindi scusatemi se dico cose assurde.
Ho lo stesso problema di karedas, il join funziona, pero' quando stampo mi escono valori ripetuti.
Sto utilizzando questo codice:$result2 = mysql_query($sql);
$result = mysql_query($sql);
$numrows = mysql_num_rows($result2);
for($x=0; $x<$numrows; $x++){
$resrow = mysql_fetch_row($result2);
$row = mysql_fetch_array($result);
$titolo = $resrow[1];
$citta = $resrow[2];
$nomeprevendita = $row['nome'];
echo "$nomeprevendita";
echo "<br>";Ciao!