Archivio

Archivio per la categoria ‘MySQL, DB Server’

Concetto di Chiave Primaria

19 March 2006 maxgrante 6 commenti

Scrivo un breve articolo per utenti non esperti per chiarire il concetto di chiave primaria.

Una relazione, prendiamo ad esempio 1:n, si realizza quando la chiave primaria della tabella1 è riportata come chiave esterna nella tabella2.
Per ogni unica chiave primaria possono corrispondere infiniti riferimenti ad essa nella tabella2, come chiave esterna.

Approfondiamo quindi il concetto di chiave primaria:

Lo scopo di una chiave primaria è quello di individuare con la massima rapidità  possibile un dato record all’interno di una tabella in modo univoco.

Ad esempio per trovare il record numero 484892 all’interno di una tabella da milioni di record.

Tale operazione avviene di fatto ogni volta che bisogna andare a recuperare i dati presenti in un’altra tabella, attività  che su un database relazionale viene utilizzata molto frequentemente.

Una chiave primaria sulla maggior parte dei DBMS puà essere impostata come numerico, numerico auto incrementale, testuale, su più campi di vari formati etc…
Il fatto importante è che la chiave primaria di una tabella rispetti le seguenti affermazioni:

La chiave primaria DEVE essere univoca all’interno della tabella, infatti non è possibile che due record abbiano la stessa chiave primaria.

La chiave primaria deve avere come requisito (non obbligatorio ma di buon senso) la compattezza:

1.Essendo fondamentale per mantenere un indice primario, con lo scopo di velocizzare la ricerca.
Maggiore è la compattezza del campo che descrive la chiave primaria della tabella e più efficace sarà  la gestione di questo indice.
Se ne evince chiaramente che una chiave primaria intera (numerica) è tendenzialmente meglio ottimizzata rispetto ad un campo stringa a lunghezza variabile.

2.Essendo il contenuto della chiave primaria utilizzato in qualità  di chiave esterna in altre tabelle è chiaro che se la chiave primaria non è compatta cià comporta uno spreco di spazio occupato dal database.

La chiave primaria nei principali DBMS viene utilizzata di solito come dato numerico e con la proprietà  di essere automaticamente incrementato dal database all’inserimento di ogni nuovo record.
In questo modo lo sviluppatore e l’utente non devono preoccuparsi di gestire la chiave primaria e quindi di dover preoccuparsi che essa non sia già  presente.

Rischio di duplicati

Un facile esempio in cui una chiave primaria numerica autoincrementale puà comportare la creazione di duplicati è data per esempio dall’anagrafica di una società .
Infatti se l’amministrazione non è attenta a verificare che una data azienda è già  presente a database il rischio è di ritrovarsi 8 Telecom, 5 Enel etc…

Questa situazione è molto pericolosa sia perchè comporta uno spreco di dati e ridondanza di informazioni e sia perchè rende poco consistenti e validi i dati nel caso ad esempio di reportistiche e statistiche, questo perchè la stessa società  verrebbe (giustamente) trattata dal database come differenti aziende.

Saluti, Maxgrante
info[AT]massimo-caselli[DOT]com

Categorie:MySQL, DB Server Tag:

Come creare una piattaforma: WAMP: (Windows – Apache – MySQL – PHP)

21 February 2006 maxgrante 3 commenti

Ciao a tutti,
oggi affrontiamo in modo molto pragmatico come realizzare una piattaforma di tipo WAMP (Windows + apache + mysql + php).
Tale soluzione è implementata in due ambiti specifici tipici:

  • Macchine di sviluppatori
  • Hosting provider che offrono anche supporto su Windows con possibilità  di utilizzare sia php che ASP.NET (Asp non lo menziono nemmeno più… :-D )

Da un punto di vista di prestazioni va detto che pur essendo sia Apache che PHP che MySQL nati per l’ambiente Linux, anche sotto Windows offrono ottime prestazioni.

L’installazione che affronteremo insieme riguarda un sistema su Windows XP ma è di fatto identico per tutti i sistemi >= Windows 2000.

Per le installazioni di mysql e apache essendo davvero elementari sarà molto breve:

  • mysql
    Consiglio di scaricare la versione 5.0.x disponibile per il download:
    http://dev.mysql.com/downloads/mysql/5.0.html
    Una volta lanciato l’installer è sufficiente o far fare configurazione standard a mysql (se si è inesperti) o in alternativa eseguire la configurazione guidata da cui è possibile fare un rapido tuning di mysql in base all’utilizzo che se ne vuole fare.
  • apache
    Per lavorare con php in ambiente Windows consiglio l’utilizzo di apache 2.0.x.
    Link per scaricare Apache: http://httpd.apache.org/download.cgi
  • php
    Veniamo ora all’installazione (non difficile) di php come modulo di apache su sistema WAMP
    Scaricare la versione 5.1.x da php.net:
    http://www.php.net/downloads.php
    Non ci resta ora che seguire pochi passi per configurare PHP:
    1. Scompattare il file .zip appena scaricato in c:\php (es. ovviamente la directory scelta puà essere anche c:\programmi\php etc…)
    2. Copiare il file presente in c:\programmi\php php.ini-dist in c:\windows o c:\winnt (a seconda del S.O.) e rinominarlo come php.ini
    3. Andare nella directory di installazione di php e copiare il file php5ts.dll (se si installa php 4 il file si chiamerà  ovviamente php4ts.dll) in c:\windows\system32
    4. Inserire le seguenti righe di configurazione in httpd.conf (file di configurazione di apache) dopo i vari AddModule:
    LoadModule php5_module c:/programmi/php/php5apache2.dll
    AddType application/x-httpd-php .php

Andate sul vostro browser e digitando http://localhost vedrete apache che vi risponde.
Potete quindi testare php creando nella document root di apache un file info.php con la chiamata a phpinfo()

NOTE SU LIBRERIE mysql

Da un po’ di versioni di php è necessario abilitare le funzioni di mysql. Cià è possibile scommentando da C:\windows\php.ini la riga con l’estensione di php_mysql.dll
Copiare libmysql.dll in C:\windows\system32
Inoltre verificate di avere in php.ini il path di dove si trovano le estensioni configurato corrtetamente
Riavviare apache.

Sperando di essere stato di aiuto a qualcuno vi saluto,
Maxgrante
info[AT]massimo-caselli[DOT]com

Tabelle in MySQL, MyISAM vs INNODB

13 February 2006 maxgrante Nessun commento

Ciao a tutti,
affrontiamo di seguito un confronto tra le tabelle MyISAM (le classiche di mysql) e le innovative INNODB.

Cerchiamo innanzitutto di schematizzarne le differenze:

MyISAM (Default engine di mysql)

Sono le tabelle storiche di mysql, derivanti direttamente dalle vecchie ISAM che sono dismesse ormai da anni.
Garantiscono indubbiamente un’ottima affidabilità  e velocità . Su versione di mysql più vecchie della 4.1 sono sicuramente da preferirsi alle INNODB.

Forniscono un vantaggio notevole che è dato dalla possibilità  di poter utilizzare indici FULLTEXT per ricerche con ranking stile Google.

Il metodo di salvataggio dei dati è basato sulla costruzione e lavorazione di 3 file binari:

  • frm
    Struttura della tabella
  • MYD
    File contenente tutti i dati della tabella
  • MYI
    File contenente i dati relativi agli indici del database

Inutile sostituirsi ai manuali… :-D
Per maggiori informazioni: http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html

INNODB

Sempre più spesso capita di trovare database server le cui tabelle di default utilizzano l’engine INNODB.
Tale scelta è dettata dalla sempre più importanza anche per progetti web di funzionalità  che normalmente mysql con le semplici tabelle MyISAM non fornisce.
Vediamo quindi una serie di funzionalità  avanzate garantite dalle tabelle INNODB:

  • Foreign Key
    Le tabelle INNODB sono in grado di gestire l’integrità  referenziale tra le chiave esterne del database, in sostanza tale integrità  è sempre stata delegata all’abilità  dello sviluppatore, ora con il motore INNODB è possibile delegare questa annosa attività  a mysql stesso, potendo quindi specificare vari comportamenti a seconda della chiave esterna utilizzata.
  • Transazioni
    Le transazioni sono fondamentali in situazioni tipiche da shop online dove sino a che non arriva conferma da parte della banca o di chi valida la carta di credito, le query non devono essere “eseguite realmente”.
    Fondamentalmente si tratta di eseguire una serie di query che verranno validate o annullate mediante chiamate COMMIT o ROLLBACK.
  • Mancanza – FULLTEXT
    Cito ora una mancanza grave nelle tabelle INNODB, l’assenza di poter (almeno per ora) dichiarare un campo come indice fulltext per poter eseguire ricerche con score alla Google.

Queste sono le principali funzionalità  aggiuntive di INNODB rispetto a MyISAM, come sempre per maggiori informazioni vi rimando al manuale ufficiale di MySQL: http://dev.mysql.com/doc/refman/5.0/en/innodb-overview.html

COME SCEGLIERE LE TABELLE????

Cercherà ora di dettare due linee guide per stabilire se conviene realizzare tabelle MYISAM o INNODB.
Innanzitutto come sempre dipende dal contesto di applicazione.
Una breve premessa sulle performance… a mio parere la velocità  dei due motori è pressochè la stessa.
Se necessitiamo di transazioni, supporto all’integrità  referenziale perchè dobbiamo realizzare un’applicazione con shop online o un magazzino con carico/scarico (N.D.R. si puà fare tutto cià anche con MyISAM) utilizzerei le tabelle di tipo INNODB, altrimenti utilizzerei le MyISAM in quanto hanno due vantaggi grandissimi, supporto FULLTEXT e soprattutto è possibile fare un backup diretto dei file binari per l’importazione/esportazione della base dati.
Con le tabelle INNODB è invece molto complesso in quanto i dati di TUTTI i database presenti sul server e che utilizzano tabelle INNODB vengono normalmente salvati nel file ibdata1.

Anche volendo salvare i file dei dati ognuno per tabella le transazioni e gli indici vengono comunque salvati nel TABLESPACE e quindi il recovery mediante import di tutti i file presente per esempio sotto: /var/lib/mysql/miodb/ NON FUNZIONA!

Sperando di essere stato il più chiaro possibile vi saluto.
Ciao. Max
info[AT]massimo-caselli[DOT]com

Soluzione problemi codifica caratteri in MySQL/PHP

28 January 2006 maxgrante 22 commenti

Buongiorno a tutti,
innanzitutto cominciamo ad inquadrare il problema e a fare presente che se ora sono in grado di scrivere questo articolo è grazie al supporto che ho ricevuto sul forum di HTML.IT da parte di Leandro Luccerini, per contatti: leandro980[AT]libero[DOT]it

PREMESSE AL PROBLEMA

  • mysql versione > 4.1.x
  • Tipo di encoding delle pagine web php utf8

DESCRIZIONE PROBLEMA

La situazione problematica nasce nel momento in cui abbiamo un sito web che deve gestire caratteri extra latini, per esempio nel mio caso ho affrontato questo problema dovendo realizzare un sito in lingua russa, ovvero utilizzando il cirillico.
Il mio approccio alla situazione e’ stato quello di realizzare TUTTE le pagine web con codifica utf8 e database, tabelle e campi di testo utf8 a loro volta.
La cosa che mi ha fatto impazzire e capirci veramente poco per diverso tempo e’ che se io inserivo nel database caratteri cirillici come ad esempio (ßрøòõт – ciao) e da PhpMyADMIN (di seguito PMA) vedevo male, idem il dump, mentre quando tiravo su i dati da applicativo tutto funzionava a meraviglia.
Capitava l’inverso con PMA, ovvero se inserivo in cirillico su PMA e visualizzavo da PMA tutto bene, via applicazione niente.

SOLUZIONE

Prima di tutto vi invito a leggervi questa parte di manualistica online di mysql, CHARSET.

Sostanzialmente sui server mysql di sistemi di hosting italiani (ma credo anche americani) e comunque in generale, l’impostazione del default_character_set è impostata a latin1.
Ma anche qualora sia impostata ad utf8 quando via script php ci connettiamo al database mysql la nostra sessione di default (nonostante la pagina sia encodata utf8) sarà attivata con character set latin1, cosa succede quindi, che i dati e le query che inviamo sfasano e il sistema memorizza erroneamente i dati.

Di fatto il comportamento giusto lo ha PMA, dobbiamo cercare quindi di emularlo.
Per farlo basta di fatto lanciare dopo ogni connessione la seguente query: SET NAMES utf8
Così facendo la connessione tra client e server sarà UTF8.

CONCLUSIONE

Per concludere possiamo dire che per siti che trattano lingua standard europee come italiano, inglese, francese etc… possiamo avere tutto il DB latin1, connessione client server latin1 ed encoding ISO-8859-1

Nel caso di siti con cirillico, arabo etc… utilizziamo tutto il database UTF8, encoding delle pagine UTF8 e soprattutto dobbiamo eseguire per sicurezza la query sopra indicata dopo ogni connessione con mysql.

Mi scuso per non essere stato molto chiaro in alcuni punti, purtroppo questo argomento è complesso e fastidioso…
Se avete suggerimenti sono benvenuti.

Ciao a tutti. Max
info[AT]massimo-caselli[DOT]com

L’articolo ZERO

30 December 2005 maxgrante Nessun commento

Ciao a tutti,
questo sito, blog, o come lo volete chiamare voi è scarno, vuoto e senza contenuti ma il progetto è quello di rendere un servizio al mondo Opensource riversando qui informazioni valide, possibilmente fresche e non di parte e trolleggianti.

La speranza è soprattutto quella di ottenere la collaborazione di voi sistemisti, programmatori o semplici appassionati per popolare questo sito e renderlo un piccolo pozzo di informazioni.

Lo scopo è anche quello di fornire un’informazione non di parte, non contro MS o Bill Gates a prescindere ma anzi, di confrontare i due mondi e chiarire diversi aspetti del mondo IT.

Invitandovi ed esortandovi a collaborare vi ringrazio per l’attenzione,

Maxgrante