Archivio della categoria ‘Database’

Creare, progettare e modificare un database SQLite con SQLite Database Browser

29xzm9x Creare, progettare e modificare un database SQLite con SQLite Database Browser

Trovandomi a lavorare con Django, ho scelto, come database di appoggio per i dati SQLite con cui non avevo mai lavorato finora. Va detto che ogni progetto su Django é gestibile indipendentemente dal database di appoggio poiché le istruzioni sarebbero le stesse anche qualora avessimo scelto MySQL o simili.

Ciononostante, tanto per verificare quanto realizzato, ho pensato di aprire un file di SQLite. Lo strumento, senza dubbio, più adatto per creare, modificare e gestire un file compatibile con SQLite é SQLite Database Browser.

Il tool é stato pensato e creato per essere utilizzato sia da utenti che sviluppatori che vogliono creare un database, modificarlo e agire sui dati di ricerca sfruttando davvero una interfaccia familiare senza dover conoscere alcun comando SQL particolarmente difficile.

Supporta creazione tabelle, gestione query e indici e molte altre features interessanti. Esistono anche dei controlli e delle procedure guidate per facilitare gli utenti meno esperti.

E’ multipiattaforma e potete scaricarlo da questo link.

DataWarehouse : introduzione al datawarehousing per gestire al meglio l’azienda

Qualche giorno fa parlavo con un mio amico di un nuovo progetto cui sta lavorando e che ha come tema principale i datawarehouse. Ho pensato che potesse esser utile ed interessante documentarmi un pò (conoscevo solo alcuni concetti base dell’argomento) e riportare il tutto in un articolo che vuol solo essere una presentazione dell’argomento datawarehouse e Business Intelligence e nulla più.

Logicamente, per approfondire e studiare al meglio questi concetti, esistono fior fior di libri, tutorials e guide completissime.

Come al solito, partiamo da Wikipedia che dice :

Un Data warehouse (o DW, o DWH) (termine inglese traducibile con magazzino di dati), è un archivio informatico contenente i dati di un’organizzazione. I DW sono progettati per consentire di produrre facilmente relazioni ed analisi.

Vengono considerati componenti essenziali di un sistema Data warehouse anche gli strumenti per localizzare i dati, per estrarli, trasformarli e caricarli, come pure gli strumenti per gestire un dizionario dei dati. Le definizioni di DW considerano solitamente questo contesto ampio.

 

La definizione é abbastanza semplice da comprendere. Un DataWarehouse è un vero e proprio sistema di Business Intelligence basato su una base dati separata rispetto al sistema gestionale ed è strutturato come replica parziale del sistema informativo aziendale in modo tale da poter ottimizzare l’analisi delle informazioni.

Tutto ruota attorno al concetto che ogni azienda, sebbene di dimensioni ridotte, avrà una base dati complessa con una mole di informazioni che, qualora lette ed analizzate correttamente, possono risultare effettivamente utili a supportare il processo decisionale. Insomma, il classico Database gestionale serve a gestire l’azienda, un datawarehouse a capire come la si sta gestendo.

Pensate, inoltre, alla velocità con cui cambia il mercato oggigiorno e alla necessità di avere un numero sempre crescente di informazioni in tempi sempre più brevi per prendere decisioni giuste e in tempi rapidi.

Ma quali compiti e scopi ha una soluzione di DW? Per quale motivo può essere utile progettare e mettere in piedi un archivio informatico tale?

Provando a riassumere, progettare un DW potrebbe essere utile per rispondere alle seguenti esigenze:

- Convertire i dati in informazioni

- Informazioni giuste al momento adeguato

- Prelevare informazioni da fonti dati eterogenee

- Pulizia e correttezza dei dati

 

Vediamo in breve di approfondire i 4 punti essenziali :

 

Convertire i dati in informazioni

Come detto, ogni azienda più o meno complessa ha nel suo gestionale una vasta mole di dati che, senza un sistema di Business Intelligence adeguato, hanno poco valore e si rivelano poco utili a supportare un processo decisionale.
Compito di un sistema di datawarehousing é quello di approfondire l’analisi fino ad  elevati livelli di dettaglio prelevando da dati nudi e crudi delle info basilari per il processo decisionale dell’azienda.

 

Informazioni giuste al momento adeguato

Fondamentale compito di un sistema di BI in seno ad un’azienda é capire quali siano le informazioni più necessarie in quel determinato momento. Si arriva, così, a poter ridurre in modo evidente il famoso “time to delivery”, cioè il tempo necessario al reperimento delle informazioni necessarie a prendere le decisioni.
Inquadrate tutto questo, come già detto prima, in un contesto di mercato davvero mordi e fuggi in cui per esser competitivi occorre soprattutto tempismo e ritmi decisionali stringenti.

 

Prelevare informazioni da fonti dati eterogenee

Uno dei maggiori problemi delle varie aziende risiede nel fatto di possedere sistemi eterogenei per i diversi processi dell’azienda. Far dialogare i vari software ed estrarne informazioni generali é compito di un DataWarehouse che é da vedere come un vero repository centrale delle informazioni aziendali. In tal modo, é possibile mettere in piedi anche un sistema di analisi incrociate tra informazioni provenienti dai vari software gestionali.

 

Pulizia e correttezza dei dati

Nei classici database transazionali non è sempre possibile pensare a controllare l’integrità del dato a meno di controlli sull’inserimento dei nuovi dati. Spesso, invece, sarebbe opportuno valutare gli impatti sui dati già esistenti. A tal proposito, un sistema di DataWarehouse può permettere controlli di coerenza sui dati prima di un import massivo al fine di segnalare incongruenze e anomalie. Questo aspetto risulta tanto più importante quanti più sistemi sono alimentanti in un’azienda.

 

Conclusioni

Avrete capito come l’azione di un sistema di Business Intelligence é molteplice e va a colpire molti aspetti dei dati aziendali al fine di ottenere le migliori informazioni possibili da esse e consentire un’analisi efficace ed approfondita.

Per ottenere questo obiettivo, però, la struttura dati aziendale deve essere copiata in strutture costruite appositamente allo scopo che é quello di estrarre informazioni sintetiche a partire da grandi moli di dati.

 

Fonti : Wikipedia e Eccellere

PHP : Come esportare lo schema di un database come xml

Avere a disposizione un dump di un database é sempre importante per vari e ovvii motivi.

Un modo originale, ma che fornisce un risultato pratico e utilizzabile in svariate circostanze, è quello di ottenere, tramite script PHP, lo schema di un database MySQL come XML. Sapete benissimo quanto sia importante e quante potenzialità abbia questo linguaggio di markup, e, pertanto, avere uno schema di un db descritto da un file xml potrebbe avere notevoli vantaggi a seconda delle esigenze del caso.

Il codice riportato qui sotto é preso da questo interessante articolo e, alla fine, farò alcune veloci considerazioni :

<?php
// database constants da cambiare in relazione al vostro da esportare
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "password");
define("DB_NAME", "name_db");

// connection to the database
$dbhandle = mysql_connect(DB_SERVER, DB_USER, DB_PASS)
or die("Unable to connect to MySQL");

// select a database to work with
$selected = mysql_select_db(DB_NAME, $dbhandle)
or die("Could not select examples");

// return all available tables
$result_tbl = mysql_query( "SHOW TABLES FROM ".DB_NAME, $dbhandle );

$tables = array();
while ($row = mysql_fetch_row($result_tbl)) {
$tables[] = $row[0];
}

$output = "<?xml version=\"1.0\" ?>\n";
$output .= "<schema>";

// iterate over each table and return the fields for each table
foreach ( $tables as $table ) {
$output .= "<table name=\"$table\">";
$result_fld = mysql_query( "SHOW FIELDS FROM ".$table, $dbhandle );

while( $row1 = mysql_fetch_row($result_fld) ) {
$output .= "<field name=\"$row1[0]\" type=\"$row1[1]\"";
$output .= ($row1[3] == "PRI") ? " primary_key=\"yes\" />" : " />";
}

$output .= "</table>";
}

$output .= "</schema>";

// tell the browser what kind of file is come in
header("Content-type: text/xml");
// print out XML that describes the schema
echo $output;

// close the connection
mysql_close($dbhandle);
?>


Dopo aver correttamente definito le costanti, vi connetterete al db MySQL e utilizzerete il comando SHOW TABLES per ottenere tutte le tabelle del database. Fatto questo, si passa ad iterare le singole tabelle per estrarre i campi di ogni tabella sfruttando il comando SHOW FIELDS.

La parte finale del codice, invece, è riservata ad inserire tutte le informazioni estratte in un file XML.

Wordpress e database : 3 modi di integrazione

wordpress-logo

Volendo lavorare alla realizzazione o alla modifica di un tema per WordPress, prima o poi, avrete bisogno di interagire con il database MySQL per ricavare delle informazioni. Siano esse il semplice titolo di un post oppure informazioni più precise e complicate da ottenere. In ogni caso é necessario scrivere qualche riga in php perchè difficilmente trovate tutto già disponibile. Ecco perché, dopo aver parlato di come connettersi ad un database MySQL, eccovi un articolo sulle vari modalità di integrazione.

La classe ezSQL di Wordpress

Come in molte applicazioni, anche per Wordpress, esiste un ‘database abstraction layer’ ovvero una classe o libreria che si posiziona tra il codice e il database che ospita i dati. Questo strato/layer fornisce un’interfaccia di comunicazione fra il cms e il database. La classe utilizzata da Wordpress é ezSQL di cui abbiamo già parlato in modo generale.

L’handler, ovvero l’oggetto con proprietà e metodi, di cui si serve la classe suddetta per tutte le interazioni tra Wordpress e Database, é la famosa $wpdb.

Essendo la $wpdb una variabile globale, all’interno di tutte le funzioni che scriverete e in cui é previsto un collegamento con il database, dichiaratela come globale in modo da poter avere libero accesso ai suoi metodi e proprietà :

functions mia_funzione()

{

global $wpdb;

………………….

}

Le proprietà dell’oggetto wpdb

Se tramite codice php abbiamo ampie possibilità di integrazione tra Wordpress e Database, lo dobbiamo alla vasta gamma di proprietà dell’oggetto wpdb. Le proprietà riescono a coprire benissimo e ampiamente tutti i metadati, le tabelle e i relativi collegamenti del DB MySQL e, proprio sfruttando queste proprietà, vi mostrerò alcune integrazioni basilari.

Premetto che, per accedere alle varie proprietà a disposizione, si usa  la seguente sintassi : $wpdb –> {property}

Inoltre, tra le tante, la proprietà più importante che prederemo in considerazione é la :  $wpdb –> {posts} che impatta la tabella degli articoli con tutti gli attributi (autore, titolo, data, content, status,category ecc) del caso. Non che le altre tabelle che fanno parte dell’installazione di default siano meno importanti, ma, indubbiamente, la tabella posts é quella che immagazzina la maggior parte dei dati di cui si vogliono ottenere informazioni.

Aggiungere Dati al database MySQL con Wordpress

Per aggiungere dati nelle tabelle MySQL del database con Wordpress potete sfruttare il metodo insert() di wpdb i cui riferimenti trovate a questo link. Vediamo, in generale, come fare, premettendo che per evitare il famoso problema dovuto alla tecnica d’attacco SQL Injection, occorre ‘bonificare’ o controllare apriori i dati da inserire. Per avere una panoramica più approfondita, dedicherò alla SQL Injection un articolo specifico.

Vediamo, ora, un esempio che consente di inserire nella tabella posts (quella che gestisce gli articoli, come detto) alcuni dati musicali con titolo del brano, descrizione e tipo sfruttando la sintassi del metodo insert() : <?php $wpdb->insert( $table, $data, $format ); ?>

functions add_music_post ( $music_titolo, $music_descrizione) {

global $wpdb;

$wpdb –> insert( $wpdb –>posts, array(‘posts_title => $music_titolo, ‘post_content’ => $music_descrizione, ‘post_type => ‘mp3’), array(‘%s’, ‘%s’, ‘%s’) );

}

Modificare Dati nel database MySQL con Wordpress

Accanto al metodo insert() visto sopra, un altro metodo consente di apportare modifiche ai dati presenti nel Database : update(). I riferimenti del metodo li trovate a questo link, ma vi anticipo che la sintassi é la seguente :

$wpdb->update( ‘table’, array( ‘column1′ => ‘value1′, ‘column2′ => ‘value2′ ), array( ‘ID’ => 1 ), array( ‘%s’, ‘%d’ ), array( ‘%d’ ) )

dove i parametri sono la tabella da aggiornare, le colonne impattate e i valori precisi. Vediamo un esempio :

functions edit_music_post ( $post_id, $titolo_new, $descrizione_new) {

global $wpdb;

$wpdb –> update( $wpdb –>posts, array(‘posts_title => $titolo_new, ‘post_content’ => $descrizione_new) , array(‘ID’ => post_id), array(‘%s’, ‘%s’, ) array (‘%d’) );

}

Ottenere Dati dal Database MySQL con Wordpress

Quest’ultimo é, di sicuro, il metodo più interessante ed utile perché consente di ottenere dati dal database cui Wordpress è collegato. Logicamente, le possibilità son molteplici anche in considerazione della enorme mole di dati cui si può attingere.

Vediamo tre tipologie di azioni :

Ottenere singolo valore da una tabella

Il metodo impattato in questa situazione é il get_var() e qui trovate i riferimenti. Il suo utilizzo é semplice poiché, per ottenere un singolo valore di una particolare riga di tabella, basta passare direttamente l’SQL statement al metodo :

$post_id = $wpdb->get_var(“select id from ‘ . $wpdb->posts. ‘ where post_autore=1 limit 1”);

La select vi restituirà banalmente solo l’id dell’ultimo post scritto dall’autore con id = 1.

Ottenere una colonna di dati

Il metodo é il get_col() e si usa, tanto per riprendere l’esempio precedente, nel caso in cui vogliate ottenere tutti i posts pubblicati dall’autore con id pari a 1 e non solo il più recente tenendo presente che il set di dati restituiti é, a tutti gli effetti, un oggetto :

$object = $wpdb->get_var(“select id from ‘ . $wpdb->posts. ‘ where post_autore=1”);

Ottenere un full data set

Nel caso in cui le vostre richieste non siano un semplice valore o una solo colonna, ma un vero dataset, abbiamo a disposizione il metodo get_results(). Qui trovate i riferimenti anche se la sintassi non é difficile.

Vediamo un esempio che vi fornisca tutti gli utenti registrati sul vostro blog dopo Luglio 2010 :

$users = $wpdb->get_results( select * from ‘ . $wpdb->users . ‘ where user_registred > ‘2010-07-01’ “);

Quelli che ho presentato sono solo alcuni tra i vari metodi utilizzabili per un’integrazione tra il codice Wordpress e MySQL. Se volete avere tutte le info necessarie, la classe wpdb e i relativi metodi sono elencati nella pagina ufficiale del codex Wordpress.

Sicurezza su Wordpress : cambiare il prefisso di default alle tabelle del database

wordpress-logo

In un articolo di qualche tempo fa avevo presentato la tecnica SQL Injection, ovvero una delle tecniche più sfruttate da hacker o malintenzionati per compromettere pesantemente la sicurezza di un blog, in generale.

In tal caso, il problema è indipendente dalla piattaforma, anche se per questo o per altri tipi di attacchi esterni, è sempre bene premunirsi o prevenirli prima che sia troppo tardi. Nel caso di Wordpress, ad esempio, un consiglio che si fornisce ai vari webmaster é quello relativo al cambiare il prefisso di default delle tabelle del database.

L’immagine qui sotto, infatti, vi mostra da PhpMyAdmin, una tipica installazione di default di un DB per Wordpress (dove sono memorizzati tutti i dati del blog, in sostanza).

wp-db-prefix-default

Come notate, le 11 tabelle di base hanno tutte un nome caratterizzato dal prefisso wp_ e, quindi, il loro nome completo sarà del tipo wp_nometabella. Il meno scaltro degli hacker conosce bene questa informazione ed ha un’arma in più per condurre il proprio attacco. Perché non provvedere? Infatti, non è così difficile e complicato cambiare quel valor wp_ e aggiungere un grado di sicurezza in più al vostro blog. Come fare?

Se dovete ancora installare Wordpress, logicamente, tutto è più facile e banale semplicemente perché nel vostro file wp-config.php potrete, in fase di installazione, modificare la seguente riga di codice :

$table_prefix = ‘wp_’;

e inserire al posto del valore di default quello che volete. Nessun altro tipo di intervento é richiesto.

Se, altresì, come nella maggior parte dei casi, avete già installato e lanciato il vostro blog, la cosa si complica leggermente, ma non di molto. Basta seguire questi passi :

  • In primis, effettuate un backup di tutto il sito (contenuti più database) e subito dopo prevedete una pagina temporanea dove indicate che il sito sarà inaccessibile per solo una decina di minuti.
  • Editate il wp-config.php cambiando il valore wp_ in un randomico wp_VzQCxSJv7uL
  • Usando phpMyAdmin o altro, lanciate i seguenti comandi SQL per rinominare le tabelle :   RENAME table `wp_commentmeta` TO `wp_VzQCxSJv7uL_commentmeta`;
    RENAME table `wp_comments` TO `wp_VzQCxSJv7uL_comments`;
    RENAME table `wp_links` TO `wp_VzQCxSJv7uL_links`;
    RENAME table `wp_options` TO `wp_VzQCxSJv7uL_options`;
    RENAME table `wp_postmeta` TO `wp_VzQCxSJv7uL_postmeta`;
    RENAME table `wp_posts` TO `wp_VzQCxSJv7uL_posts`;
    RENAME table `wp_terms` TO `wp_VzQCxSJv7uL_terms`;
    RENAME table `wp_term_relationships` TO `wp_VzQCxSJv7uL_term_relationships`;
    RENAME table `wp_term_taxonomy` TO `wp_VzQCxSJv7uL_term_taxonomy`;
    RENAME table `wp_usermeta` TO `wp_VzQCxSJv7uL_usermeta`;
    RENAME table `wp_users` TO `wp_VzQCxSJv7uL_users`;

Precisiamo che questo vale per le 11 tabelle presenti nell’installazione di default, ma tutto va applicato anche ad altre tabelle (magari relative ai plugins installati) qualora presenti.

  • Non é finito perché occorre anche modificare tutte le altre istanze presenti in tabelle col vecchio prefisso ed in particolare parlo di options ed usermeta. Quindi lanciate :  SELECT * FROM `wp_VzQCxSJv7uL_options` WHERE `option_name` LIKE ‘%wp_%’ SELECT * FROM `wp_VzQCxSJv7uL_usermeta` WHERE `meta_key` LIKE ‘%wp_%’ e provvedete a cambiare manualmente i prefissi dai risultati delle suddette queries.

In teoria, ma anche in pratica, il gioco é fatto. Qualche piccolo e veloce test sulle pagine del blog (front end e back end) e potete riaprire il blog!

Via DiggingIntoWordpress

Query SQL – Come usare il Join nelle relazioni fra tabelle

Scopo primario di una database è quello di conservare i dati in maniera stabile e sicura, ma scopo di chi lo crea e gestisce è quello di sfruttare tutte le possibilità a disposizione per organizzarli in una struttura tale che eviti la ridondanza dei dati stessi. Quando si parla di normalizzare un database, si intende [...]

Ottimizzare query SQL: velocizzare l’esecuzione di una query con ezSQL

La stragrande maggioranza delle applicazioni web, dei blog e dei siti poggia la sua struttura su un database. Capite bene perché rendere performante un database diventa un requisito fondamentale per le performances di qualsiasi applicazione internet. Un primo e immediato intervento di ottimizzazione, quindi, può esser fatto sulle queries che restituiscono i vari dati perché [...]

3 plugins per ottimizzare il database su Wordpress

Come ben sapete, ogni blogger che abbia un minimo di esperienza deve non solo pensare a scrivere articoli di qualità, ma anche a gestire al meglio il proprio blog ottimizzandolo laddove occorre. Gli utenti che usano Wordpress, tra i tanti aspetti troppo spesso trascurati, si dimenticano che tutta l’installazione del loro CMS (e buona parte [...]