Newsgroup: it.comp.software.database
Titolo: Chiedo un aiuto (lungo)

Ok, sono uno studente di ingegneria che si ï¿œ laureato diverso tempo fa 
e solo adesso si ï¿œ messo a lavorare su un programma di database per 
gestire meglio della roba che mi serve per lavoro.
 
In pratica ho installato EasyPHP e mi sono fatto un'interfaccia php per 
i cavoli miei ed un database per i cavoli miei che ho importato sul 
phpmyadmin fornito da easyphp.
 
Il database ï¿œ innodb mysql 5.5
 
Il problema ï¿œ che sono decisamente niubbo e piï¿œ vado avanti piï¿œ mi 
tocca ragionare indietro per correggere errori di implementazione 
creati a cazzo e dovuti alla scarsissima esperienza (ho 35 anni e mi ï¿œ 
toccato praticamente reimparare da zero negli ultimi 8 mesi)
 
Allora ecco alcune domande:
 
1) originariamente il database comprendeva delle letture di alcuni 
impianti a cui era associata una matricola di un contatore. Sebbene il 
cambio di contatore fosse stato implementato dal lato letture solo 
ultimamente l'ho implementato anche in anagrafica iniziando ad inserire 
una tabella a parte per lo storico. Attualmente le letture dei 
contatori comprendono un "progressivo" che si segna a quale numero di 
contatore si passa. Perï¿œ l'implementazione di una cosa simile in PHP mi 
costringe a fare passaggi non proprio immediati in cui mi devo prima 
cercare qual'era l'ultimo progressivo per poi assegnare lo stesso 
progressivo al nuovo insert per una nuova lettura. Stavo pensando di 
sostituire il progressivo con un semplice "check" per dire se ï¿œ stato 
sostituito il contatore in quella singola lettura. Perï¿œ c'ï¿œ il problema 
di versioni multiple di una stessa lettura (che puï¿œ essere rivista o 
aggiornata) ed il fatto che attualmente potrei fare una semplicissima 
corrispondenza tra il progressivo e la chiave dell'indice della lettura 
per trovare la matricola del contatore, se mettessi un check sarebbe 
piï¿œ lunga come cosa da fare. Perï¿œ ï¿œ anche vero che mi serve molto poco 
spesso (leggi: praticamente mai) sapere a quale matricola di contatore 
ï¿œ associata una determinata lettura. (ed infatti sto implementando lo 
storico solo adesso, prima tenevo traccia solo dell'ultima matricola). 
Normalmente non mi serve sapere a che numero di contatore ci si trova, 
quindi sarebbe una informazione inutile che potei sostituire solo con 
un booleano, ma... c'ï¿œ un "ma". Attualmente posso sapere esattamente 
quale ï¿œ l'ultima lettura di un determinato contatore con un semlice 
check sulla massima data associata ad una lettura su un determinato 
valore della colonna riguardante il progressivo del contatore. Con un 
booleano dovrei prima farmi il conto dei booleani, poi cercare il 
"vero" numero X riguardante un cambio di contatore e quindi prendere la 
lettura precedente o l'ultima lettura che venga dopo quel "vero" e 
prima del "vero" successivo.
Non so quindi se ne vale la pena.
 
2) ho dovuto creare delle tabelle multiple per via di multipli tipi di 
contatori che proponevano informazioni diverse e che vanno registrate 
in un certo modo. attualmente quindi in php mi devo fare una cernita di 
quale tabella usare in base al dato corrispondente in anagrafica 
dell'impianto. Sarebbe carino avere una tabella di quale tabella ï¿œ 
associata a quale indice di tipo contatore? Ce ne ï¿œ giï¿œ una che si 
segna solo la descrizione del tipo di contatore associata all'indice. 
Non quale nome di tabella ï¿œ associato a quel tipo di contatore. Il 
problema ï¿œ che se vado a rinominare una tabella poi logicamente devo 
ricercarmi in tutto il codice php ogni istanza di quel nome tabella per 
andarlo a cambiare. Cosa che vorrei evitare. C'ï¿œ un modo per dire al 
database quale tabella ï¿œ associata ad una determinata voce e cambiare 
automaticamente il nome della tabella associata a quella voce in caso 
di cambio di nome della tabella?
 
altre domande non mi vengono in mente. Grazie per l'attenzione
 
-- 
i'll be brie-
g+: 
https://plus.google.com/+SimoneSpinozzi/
 
DA: 
http://butterfly-dragon.deviantart.com/
 
Steam: simone.spinozzi
Skype: simone.spinozzi


 
Si, ci sono gli indici ed i rapporti fra tabelle che sono legate fra 
loro appunto dagli indici.
Come certamente saprai sono 1/1, 1/M, M/M (M sta per molti)
Una volta progettato il database ed in esso i rapporti fra le tabelle 
non occorre altro, tantomeno cambiare i nomi alle tabelle.
Leonardo
 
-- 
Non sono su facebook
Se anche tu vuoi cancellarti
http://www.giardiniblog.com/come-cancellarsi-da-facebook-eliminare-account/
 

 occorre altro, tantomeno cambiare i nomi alle tabelle.
 
Non intendevo una chiave esterna, a meno che io non possa chiedere al 
database a quale chiave è associata la chiave esterna.



 
Nemmeno io, sei sicuro di conoscere a sufficienza php/mysql?


 Leonardo
 
All'inizio del messaggio (capisco che mi sono dilungato) dicevo che ho 
35 anni e solo adesso da quando mi sono laureato mi sono messo a 
smanettare e quindi praticamente ho un totale di 8 mesi di pratica.
 
Deduco che probabilmente hai saltato molta roba nel rispondermi anche 
perché hai risposto solo all'ultima domanda e senza comprendere bene la 
situazione che avevo già spiegato, non alle domande precedenti. ;)
 
Sono prolisso. Lo so. Volevo spiegare bene la problematica. Però 
sinceramente mi pare eccessivo scrivere 6 kb di messaggio e doverlo 
rispiegare tutto da capo un pezzo alla volta perché era lungo :P



Più che prolisso, non hai spiegato quali sono e come sono in origine i dati da memorizzare e cosa vuoi ottenere dell'interrogazione del database.
Descrivere questo in modo sintetico è importante per ricevere un aiuto sull'impostazione del database.
In genere, nei database relazionali, il rapporto fra le varie tabelle viene implementato per mezzo degli indici (AUTO_INCREMENT) primari e secondari.
Personalmente non ho mai letto o sentito dire di dover cambiare i nomi delle tabelle per rendere fruibile un database.
Saluti


 
Questa è Usenet, le persone non è che abbiano voglia di leggersi un post 
di 100 e passa  righe e tra queste interpretare le varie problematiche 
sollevate
Cerca di essere sintetico andando dritto al problema (uno o due per 
volta è meglio che tanti problemi in colpo solo) e vedrai che ti 
risponderanno
 
 
 

 database. Saluti
 
No, mi ï¿œ toccato cambiare i nomi delle tabelle per rendere piï¿œ semplice 
il loro indirizzamento nelle query create meccanicamente dal php. 
Siccome non ï¿œ la prima volta che provo uno standard diverso per vedere 
se funziona meglio devo poter reindirizzare le tabelle in qualche modo.


.
 
 
-- 
Andrea
 

 il loro indirizzamento nelle query create meccanicamente dal php.
 
Cosa sono queste query create meccanicamente da PHP?
 
 
-- 
Andrea
 

 (AUTO_INCREMENT) primari e secondari. Personalmente non ho mai letto o
 
si chiamano chiavi, e farle "Auto-increment" non sempre e' una buona
idea (anzi, quasi mai)
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 
 
Ok, contento te, contenti tutti.
Leonardo
 

 Ok, contento te, contenti tutti.
 
saranno di sicuro molto piu' contenti quelli che non lavoreranno con te.
 
Addio Jack



 
Rapporto ?
tecnicamente il legame tra una tabella e l' altra si attua attraverso le 
cosiddette foreign keys
Hanno però una piccola limitazione, la colonna  o le colonne di 
riferimento (quelle a cui si punta) devono  avere un constraint di 
univocità come requisito
Che poi dietro un costraint siffatto ci sia un indice è solo un 
dettaglio tecnico per via delle prestazioni, non un requisito di per se
 
 

 Cosa sono queste query create meccanicamente da PHP?
 
esempio:
 
+----------------------------------------------------------------------+
$queryS_Letture = 'SELECT *
	FROM '.$databaseDaUsare.'
	WHERE NomeImpianto = "'.$NomeImpianto['NomeImpianto'].'"
	AND LetturaAnnualeOMensile = "M"
	AND Origineletturecontatori = "USR"
	AND Anno = '.$_POST['anno'].'
	AND Mese = '.$_POST['mese'].'
	ORDER BY SostituzioneContatore DESC, Versione DESC
	LIMIT 1;';
$RA_S_Letture = $database->DatabaseRW($queryS_Letture, true);
+----------------------------------------------------------------------+


 
https://drive.google.com/file/d/0B82goQedMlK6N3hvRy1KbHYtV1E
 
 
nota: mancano ancora alcuni costraint perché ci sto lavorando per 
aggiungere "feature" e quindi non posso togliere i dati vecchi (tipo 
l'iban nell'anagrafica) per aggiungere quelli nuovi (tipo il 
riferimento all'iban nella tabella degli iban) finché non avrò finito i 
cambiamenti.
 
Quindi se vi sembra strano che alcuni costraint su foreign key non 
siano presenti nonostante la struttura sembri ftta apposta per pre 
vederli... è perché è ancora un work in progress ;)


 Ciao Jack
 
+1
 
le chiavi autoincrementanti vanno usate quando servono; metterle in ogni e 
qualsiasi tabella non ha senso.
 
-- 
Paolo opg
 
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 
[cut]
 
ai dont spik piaccapi' veri uell...


 ai dont spik piaccapi' veri uell...
 
E allora che me lo chiedi a fare? :P
 
Come hai potuto vedere:
- Chi sa fare database non sa nï¿œ il php nï¿œ come funzionano enti a cui 
servono i dati, il lavoro per cui servono i dati e quali dati sono 
importanti e mi servono avere "entro 10 giorni al massimo" quindi "quel 
pezzo" deve funzionare "entro 10 giorni incluso nei 10 giorni il tempo 
per fare tutte le dichiarazioni"
- Chi sa fare il php a volte, ma non sempre ha competenze di database, 
ma a cazzo di cane, tanto ï¿œ vero che l'ultima volta che mi sono afidato 
ad un tizio ... quello mi ha fatto il database senza nemmeno una chiave 
nï¿œ un indice. Solo tabelle e colonne. Non sapevo nemmeno si potesse 
fare una tabella senza indici nï¿œ chiavi. Ed io ho 35 anni, quello ne 
aveva 50, doveva averci lavorato in passato.
- Chi sta negli enti decide ogni 3 mesi di cambiare tutte le carte in 
tavola rendnendo spesso tutti i dati che uno ha obsoleti
 
Esempio: "Terna? Cos'ï¿œ TERNA? Ora si chiama GAUDI! Che si pronuncia con 
l'accento sulla i, ma non metterci l'accento quando lo scrivi. Noi non 
c'entriamo niente con TERNA. Via tutto quel lavoro chilometrico che hai 
fatto! Ricomicia da capo. Che usiamo altri nomi, codici e procedure, 
per cui ci serve roba diversa. Ora comandiamo noi. Ah, approposito, giï¿œ 
che comandiamo noi alcuni codici continueranno a chiamarsi allo stesso 
modo per noi, ma in 3 modi diversi per i 3 enti diversi a cui ti devi 
relazionare. Sono lo stesso codice, ma ha 3 nomi. Se cambia un codice 
cambiano gli altri per forza perchï¿œ sono lo stesso codice. Ma ha 3 
nomi. Ricordatelo."
 
In queste condizioni, che modo ho di creare un database ben 
strutturato, duraturo ed inalterabile che mi serva per piï¿œ di 3 mesi 
alla volta? Quanto mi costa chiamare uno specialista ogni 3 mesi per 
cambiare il database secondo le nuove procedure?


 
 
 
lavoro in un settore analogo, con enti pubblici, regolamenti 'fluidi' e 
normative fumose; ti capisco meglio di quanto credi.
 
il punto e' che se hai un db ben strutturato puoi riciclare le 
informazioni in maniera piu' semplice e rapida; il passaggio da una 
struttura all'altra non e' indolore ma ti si semplifica enormemente.
 
se la struttura e' 'non normalizzata' diventa tutto piu' complicato.



 
Personalmente non le ho mai usate
E poichè uso come database oracle e postgresql bastano  le sequence che 
per fortuna le hanno
In sqllite invece basta fare una tabella che faccia da sequence, come mi 
è capitato
MySql non mi piace e cerco di non  usarlo se posso scegliere
 
 
 

 se la struttura e' 'non normalizzata' diventa tutto piu' complicato.
 
Taglio tutto e lascio solo questo.
 
Ok, hai reso chiaro il tuo punto.
 
Diciamo che dato che il database non viene utilizzato direttamente, ma 
con una interfaccia, parte dei problemi che hai detto si risolvono 
abbastanza semplicemente, dato che usa una GUI cambiare nome a una 
colonna o tabella finora non mi ha dato molti problemi, ed avere nomi 
diversi per cose diverse mi ï¿œ utile per non dovre scrivere (come hai 
detto) il percorso completo di cosa mi serve che invece ï¿œ piï¿œ 
difficile. ï¿œ stato aggiungere cose che mi ha dato problemi. E 
solitamente aggiungo cose perchï¿œ saltano fuori condizioni nuove che 
prima non esistevano.
 
Quindi, si, dovrei ottimizzare tutto per rendere il database piï¿œ 
robusto, e li mi potrebbe aiutare un esperto, ma con la "normativa 
fluida" come l'hai chiamata tu, cosa gli dovrei dire all'esperto? "non 
so cosa mi serve perchï¿œ me lo cambiano ogni 3 mesi e roba che prima era 
fissa ed immutabile ï¿œ diventata a caso quindi vedi tu cosa mi puoi 
combinare." ?
 
So che metterci mano dopo ï¿œ sempre un travaglio. L'ho sperimentato piï¿œ 
volte. Ma se non so nemmeno che certe cose possono esistere, perchï¿œ se 
le inventano da un momento all'altro per complicare affari semplici, mi 
spieghi cosa dovrei dire? "inventati"?
 
Qualche ottimizzazione qua e lï¿œ l'hai suggerita tu, ora come ora devo 
implementare, come ti ho detto "quello che mi serve tra 10 giorni", 
perchï¿œ per adesso ï¿œ quello ad avere la prioritï¿œ.


> altre domande non mi vengono in mente. Grazie per l'attenzione
 
Secondo me ci sono problemi di normalizzazione.
Hai questi oggetti:
La fornitura
I contatori
Le letture
 
Se caratterizzi bene questi oggetti poi le relazioni tra loro e le sotto tabelle (ad esempio una per i tipi di contatore)
vengono da soli , la parola d'ordine sono chiavi primarie e chiavi esterne piu' una pesante normalizzazione.
 
Giulia
 

 loro appunto dagli indici
 
Quindi lo statement:
 
ALTER TABLE stocazzo ADD CONSTRAINT fk_staminchia FOREIGN KEY(staceppa) 
REFERENCES ON staverga(staceppa);
 
Crea un indice? E io che da piu` di 10 anni credevo che un indice si creasse 
con CREATE INDEX...
 
Enrico
P.S. hint: essere sintetico e chiaro e` una regola di Usenet. Ammettere che 
si sta dicendo una castroneria e` buona educazione

 REFERENCES ON staverga(staceppa);
 
Colgo un savio uso dell'aggettivo dimostrativo.
 
-- 
Andrea
 

 con CREATE INDEX...
 
Chiedo scusa per il ritardo nel rispondere a questo messaggio, ma l'ho 
letto solo ora.
 
Quelle sono le chiavi esterne. Ho chiavi primarie e chiavi uniche e 
chiavi esterne. Cosa intendi per indice? A me sincermente non da 
nemmeno l'opzione di segnare una chiave come "indice".
 
https://drive.google.com/file/d/0B82goQedMlK6NjcxVHduWFdEZU0
 
 
Poi scusami, ma il set di chiavi primarie non nulle non ï¿œ appunto un 
indice?
 
Se quello non ï¿œ un indice a cosa serve definire una chiave come indice?
 
Ammetto la mia ignoranza non intendevo mentire volontariamente.


 indice?
 
No, sono chiavi che *implicitamente* creano un indice
 
Enrico

 No, sono chiavi che *implicitamente* creano un indice
 
ah, ok, ora capisco che intendi. Quindi se vado ad editare manualmente 
il file di importazione potrei crearmi degli indici anche di chiavi che 
non siano primarie, non nulle, etc.
 
ok, buono a sapersi.
