Relazione molti a molti | Progettazione di DataBase Relazionali

Topic: Pubblico - Composto da 4 Posts di 3 Utenti.

13 Agosto, 2011 05:57 #1
kokkobil
Utente

kokkobil
Registrato: Aug, 2011
Posts: 1
Offline

Un saluto a tutti.
Il mio nome è Giuseppe e mi dedico alla programmazione di piccole procedure con archivi per la risoluzione di esigenze personali. Ultimamente ritengo che sia arrivato il momento di passare ad un db su server web per avere accesso ovunque. Da qui le mie difficoltà per cui chiedo dove posso trovare articoli o pubblicazioni sull'ottimizzazione. In particolare:
Ho sei tabelle ognuna delle quali necessita di uno o più campi RECAPITO per contenere tanto un nr di telefono, tanto una mail. Avevo pensato di realizzare una tabella CODICERECAPITO semplicemente per creare un codice unico da inserire nel campo RECAPITO di ciascuna delle sei tabelle. Successivamente Creerei una tabella RECAPITO con il campo ID, il tipo di recapito e il dato del recapito, nonchè con un campo CODICERECAPITO per collegare ognuna delle sei tabelle al dato recapito.
E' questa una procedura correttà ai fini dell'ottimizzazione ? Esistono altri metodi più "ortodossi". Grazie e compimenti per l'ottimo sito.

13 Agosto, 2011 09:57 #2
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Usando il "MySQL Librarian" troverai diversi blog (in inglese) che trattano di ottimizzazione, a diversi livelli di difficoltà.

Non sono sicuro di aver capito l'approccio che descrivi. La regola generale per le relazioni many to many è:

Tabella A (A_id, altri campi)
Tabella B (B_id, altri campi)
Tabella A_B (A_id, B_id)

Nel tuo caso, al posto di A ci sono sei tabelle. La soluzione si può adottare ugualmente (anzi, rimane l'unica possibile), ma probabilmente complica alcune query.
Queste tabelle hanno gli stessi campi?

22 Agosto, 2011 18:21 #3
biagiopas
Utente

biagiopas
Registrato: Mar, 2011
Posts: 17
Offline

il modo che descrivi mi sembra corretto

in questo modo ad ogni riga delle sei tabelle puoi fare corrispondere un numero arbitrario di recapiti
se crei una maschera grafica per il record-utente puoi visualizzare i recapiti in una select

ps tecnicamente questa è normalizzazione, l'ottimizzazione è un'altra cosa

Ultima modifica 22 Agosto, 2011 18:22 di biagiopas

22 Agosto, 2011 22:25 #4
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Può darsi che ti sorga un altro problema: facendo una JOIN a partire dal recapito, potresti non sapere in quale tabella devi andare a pescare una corrispondenza.
Si può risolvere con una vista, supponendo che le 6 tabelle abbiano (più o meno) gli stessi campi:

Tabella clienti(id, nominativo, indirizzo)
Tabella fornitori(id, nominativo, indirizzo)
Tabella aziende(id, ragione_sociale, indirizzo)

1CREATE VIEW contatti AS (
2(SELECT id, nominativo, indirizzo, 'cliente' AS tipo FROM clienti)
3UNION DISTINCT
4(SELECT id, nominativo, indirizzo, 'fornitore' AS tipo FROM fornitori)
5UNION DISTINCT
6(SELECT id, ragione_sociale AS nominativo, indirizzo, 'azienda' AS tipo FROM aziende)
7);

A questo punto, una query "complessiva" non è più un problema:

1SELECT ....
2FROM (contatti c LEFT JOIN contatti_recapiti cr
3ON c.id = cr.id_contatto)
4LEFT JOIN recapiti
5ON cr.id_recapito;

Come dici tu, l'approccio che ti avevo descritto è normale, ma un db normalizzato è piuttosto ostico. Si rimedia denormalizzandolo un po', oppure creando viste/tabelle riassuntive.

Spero di essere stato chiaro.

Condividi su:

Loggati o Registrati per replicare