Newsgroup: it.comp.software.database
Titolo: Foreign Key 'logiche'

Salve, sto cercando una soluzione ad un problema con MySQL.
Non so se la cosa si può fare.
Il fatto è questo: ho creato tre tabelle:
Regioni
+------------+---------------------------------+
| Field      | Type                            |
+------------+---------------------------------+
| ID_Regione | tinyint(3) unsigned             |
| Nome       | char(30)                        |
| Geo        | enum('NORD','CENTRO','SUD','?') |
+------------+---------------------------------+
Province
+--------------+---------------------+
| Field        | Type                |
+--------------+---------------------+
| ID_Provincia | tinyint(3) unsigned |
| ID_Regione   | tinyint(3) unsigned |
| Nome         | char(30)            |
| Sigla        | char(4)             |
+--------------+---------------------+
e Comuni
+--------------+---------------------+
| Field        | Type                |
+--------------+---------------------+
| ID_Comune    | int(10) unsigned    |
| ID_Provincia | tinyint(3) unsigned |
| Nome         | char(100)           |
| CodFis       | char(4)             |
| CAP          | char(5)             |
+--------------+---------------------+
Ok...
Le tabelle sono di tipo InnoDB e ho creato delle foreign keys tra 
Province.ID_Regione->Regione.ID_Regione e 
Comuni.ID_Provincia->Province.ID_Provincia.
Ora mi chiedevo: siccome devo filtrare le città del nord, o del sud o 
del centro... potrei semplicemente fare questa query:
SELECT P.Nome
FROM Province P INNER JOIN
( SELECT *
   FROM Regioni
   WHERE Geo='NORD'
) AS Reg
ON P.ID_Regione=Reg.ID_Regione
e un discorso identico casomai volessi direttamente i comuni.
Mi è venuta però una curiosità: tramite foreign keys è possibile creare 
un campo sulle tabelle Comuni e Province che indichi (risalendo alla 
regione di appartenenza) se quel comune o quella provincia è del 
NORD/CENTRO/SUD?
In modo che se (faccio un esempio) decido di spostare il Piemonte al SUD 
automaticamente vengono aggiornate le tabelle figlie?
E' giusto un esempio, ma ci sono altri esempi di database in cui una 
cosa simile sarebbe molto comoda...
Grazie a chiunque perda un po' di tempo a leggere questo post!
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 un campo sulle tabelle Comuni e Province che indichi (risalendo alla 
Cosa intendi per "creare un campo"? Se ti serve reperire quell'informazione
sempre e comunque forse e' conveniente riportare tale informazione in tutte
le tabelle (denormalizzare per migliorare le prestazioni), altrimenti puoi
usare una Join e reperire l'informazione quando ti serve.
Davide
-- 
People who love sausages, respect the law, and work with IT standards
shouldn't watch any of them being made.
--Peter Gutmann

 usare una Join e reperire l'informazione quando ti serve.
Si, sarebbe proprio una denormalizzazione.
Ma il problema non č riuscire a denormalizzare. Il problema č: se un 
giorno mi gira di cambiare le impostazioni e settare nella tabella 
"Regioni" il Piemonte come CENTRO oppure come SUD pittosto che come 
NORD, c'č un modo perchč questo cambiamento si ripercuota sulle tabelle 
figlie (denormalizzate)?
Cioč a quel punto tutte le province con ID_Regione del piemonte 
dovrebbero cambiare il loro campo da NORD a CENTRO o SUD.
Si possono legare in tale modo le tabelle?
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).


 figlie (denormalizzate)?
Fai una update. Da sole non si aggiornano di certo.
Davide
-- 
I'm a geek with a journalism degree. I suppose that makes me overqualified
for a job with ZDNet. Darn. 
   -- From a Slashdot.org post

 Davide
Era quello che temevo... :)
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).


 automaticamente vengono aggiornate le tabelle figlie?
Se tu leghi le tabelle con dei tramite dei campi ID, le join tu le vai a
fare su quel campo. Quindi qualunque informazione tu modifichi nella
tabella "padre" (a parte l'id in questione naturalmente) gli aggiornamenti
verranno automaticamente riportati nelle tabelle figlie, nel momento in
cui tu vai a fare una select.
altrimenti se duplichi i dati nelle tabelle hai ridondanza e devi fare un
update in cascata su tutte cosa molto sconveniente.
per questo esistono le foreign-key.
ciao f
-- 
====================================
Coltiva linux, che tanto windows si pianta da solo!
Linux registered user: 364664 (
http://counter.li.org
)

 ciao f
Ciao Darkbyte


 quel record fare qualcosa sulle figlie?
ribadisco, se la struttura delle tabelle è la stessa che tu hai riportato
non ce ne è bisogno. Se le vuoi denormalizzare, cioè vuoi ridondare i
dati sulle tabelle devi fare una update manuale come gia davide ti ha
spiegato, o aspettare che inseriscano i trigger in mysql!
purtroppo mysql non ha questi strumenti che in altri db sono presenti.


> spiegato, o aspettare che inseriscano i trigger in mysql!
Ah quindi esiste qualcosa a tale scopo per semplificare la vita del 
povero programmatore? :D
Io avevo chiesto per MySQL, ma sapere che esiste qualcosa su altri DB 
comunque mi ha soddisfatto la curiosità.
Thx a tutti!


 povero programmatore? :D
esistono esistono!!! postgresql le ha, oracle pure (ma cosa è che non ha
oracle!?!?!?), firebird e molti altri che qui non ti sto a nominare.
tutto sta a vedere cosa ti serve e quanto lavoro ti risparmia! ;-) poi
ogni db ha i suoi pregi e i suoi difetti
