[Python] python DB/TABLES ...

Daniele Varrazzo piro a develer.com
Sab 11 Maggio 2013 17:12:35 CEST


On 2013-05-11 15:51, Remo The Last wrote:
> ...forse effettivamente c'è un pochino di nebbia nella mia logica e
> nel mio approccio.
>
> Per fare l'esempio:
> Lancio un traceroute e catturo gli indirizzi IP di ogni hop.
> L'indirizzo di ogni hop viene registrato in tabella in maniera
> successiva tipo hop1, hop2, hopn, ognuno con il proprio indirizzo IP.
> Di per sè il traceroute è dinamico con hop che cambiano anche in
> numero e dunque devo creare dei hopn+1, hopn+2...  in più rispetto ad
> un traceroute precedente con numero inferiore di hop.
>
> Come mi muovo con i campi delle tabelle? Da dove inizio? Come creo un
> campo per ogni hop successivo ovvero hopn++?  E ancora: gli hop 
> devono
> essere indicizzati in ogni tabella per un approccio più facile.
>
>  Cosa sbaglio o cosa non capisco?

che non vedi (ma è normale, bisogna farci l'occhio) che puoi 
memorizzare ogni hop in un record diverso della stessa tabella. Puoi 
avere 2 tabelle: in una (chiamiamo tr) hai un record per ogni richiesta 
di traceroute (che può memorizzare es. ip di partenza, ip di arrivo, 
timestamp della prima richiesta ecc. ed ha un id univoco) ed una 
(chiamiamo tr_hop) che memorizza tutti gli hop, che contiene es. i campi

  - tr_id (fkey all'id della richiesta)
  - hop_n (numero dell'hop nella richiesta: 1, 2, 3 ecc.)
  - ip_addr (indirizzo del nodo)
  - timestamp (in cui il nodo è stato raggiunto)
  - time (tempo per raggiungere il nodo dal precedente)
  - ... altre informazioni che vuoi memorizzare per hop.

la coppia (tr_id, hop_n) è univoca e potrebbe essere una buona chiave 
primaria in questo caso.

Con questa tabella puoi ricostruire un solo traceroute (select * from 
tr_hop where tr_id = %s) oppure puoi sapere quanto è lento in media un 
nodo (select avg(time) from tr_id where ip_addr = %s) e così via.

Impara a riconoscere questo "code smell": nei database esistono solo 3 
numeri possibili: 0, 1 e "tanti". Se di una cosa ne hai "tanti" li devi 
mettere come diversi record in una sola tabella. Se fai "tante tabelle" 
oppure "tanti campi" stai sbagliando. Garantito al limone.

La tabella più cretina con cui abbia mai lavorato non ricordo cosa 
conteneva, ma aveva un record per ogni anno e una colonna per ogni mese:

               gennaio  febbraio  marzo  aprile ...
     2010           10        20     30     ...
     2011           45        66    ...
     2012          ...
     ...

buona fortuna a capire i pezzi venduti, o qualunque cosa fosse, da 
luglio 2010 a marzo 2012...


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python