Il 06/07/21 09:07, ^Bart ha scritto:
in un ottica di puro DBA i dati non devono essere MAI duplicati, devi
cercare di normalizzare il più possibile.
per farti un esempio
il dato "data nascita" deve essere presente SOLO e SOLTANTO in una tabella.
tutto il resto deve essere referenziato alla tabella che lo contiene
REGIONE
id_regione
regione
...
...
COMUNE
id_comune
Comune
sigla
cap
data_inizio
data_fine
id_regione
utente
id_user
user
pass
...
...
anagrafica_utente
id_user
nome
cognome
sesso
data_nascita
...
id_comune
id_regione (teoricamente potrebbe essere omesso, ci si arriva dal comune)
id_nazione
....
pensa a quanto è sbagliata una situazione del genere se dovessi
duplicare i dati
contratto_bolletta
id_user
nome
cognome
data_nascita
id_comune
id_regione
num_contratto
fattura_bolletta
id_bolletta
num_contratto
....
...
in questo esempio avresti i dati anagrafici (nome, cognome,
data_nascita, id_comune, id_regione) duplicati che potrebbe differire
(ad esempio se l'utente cambia la citta di residenza e aggiorni solo
l'anagrafica e non il contratto) e in una richiesta di estrazione "tutti
gli utenti residenti nel lazio che hanno un contratto" quale dato è
corretto estrarre?
tu indichi a ritroso se parti dall'utente,
select a.nome, a.cognome, a.sesso, ... b.comune, c.regione, d.nazione
from anagrafica_utente a, comune b, regione c, nazione d, user f
where a.id_comune = b.id_comune
and a.id_regione = c.id_regione
and a.id_nazione = d.id_nazione
and a.id_user = f.id_user
and f.user = "PIPPO"
ma se partissi da "estrai tutti gli utenti di milano" non è ritroso.
select a.nome, a.cognome, a.sesso, b.comune, c.regione, d.nazione,f.user
from anagrafica_utente a, comune b, regione c, nazione d, user f
where a.id_comune = b.id_comune
and a.id_regione = c.id_regione
and a.id_nazione = d.id_nazione
and a.id_user = f.id_user
and b.comune = "Milano"
se ti servisse di ricercare il numero di utenti raggruppati per comune
dell'area della lombardia, uomini con un età superiore ai 40 anni.
select count(a.id_user) as num_utenti, comune
from anagrafica_utente a, comune b, regione c
where a.id_comune = b.id_comune
and a.id_regione = c.id_regione
and TIMESTAMPDIFF(YEAR, data_nascita, NOW()) > 40
and sesso = 'M'
group by comune
non esiste il concetto di ricerca al ritroso, esiste il concetto di
estrazione di dati o aggregati.
un ultimo consiglio
inserisci sempre i riferimenti agli "id" e mai alla descrizione
come ho fatto nei miei esempi ho sempre indicato id_comune o id_regione,
MAI la descrizione della stessa.
questo perchè la descrizione è soggetta a cambiamenti.
https://it.wikipedia.org/wiki/Modifiche_territoriali_e_amministrative_dei_comuni_d%27Italia