SQL è ancora un altro linguaggio essenziale per gli sviluppatori che desiderano creare siti Web basati sui dati. Tuttavia, molti sviluppatori non hanno familiarità con vari aspetti di SQL; quindi in questo articolo analizzeremo dieci suggerimenti essenziali.
Gli sviluppatori Web spesso hanno una pletora di lingue a loro disposizione. È fondamentale per gli sviluppatori utilizzare la lingua appropriata per il lavoro.
Esaminiamo il seguente codice. Nel primo esempio, lo sviluppatore sta selezionando tutte le colonne e tutte le righe dalla tabella dei clienti. Nel secondo esempio, lo sviluppatore sta selezionando solo il nome, il cognome e l'indirizzo della tabella clienti per un singolo cliente con ID 1001. Non solo la seconda query limita le colonne restituite, ma anche le prestazioni migliori.
SELEZIONA * DA cliente;
SELECT firstName, lastName, shippingAddress FROM customer WHERE customerID = 1001;
Quando scrivi il codice, assicurati che funzioni in modo efficiente.
Troppi sviluppatori sono soddisfatti del codice che esegue in modo adeguato su 100 righe di dati, con poca attenzione a quando il database avrà 10.000 righe.
I database memorizzano informazioni preziose. A causa di questo fatto, i database sono spesso i primi obiettivi di attacco. Molti sviluppatori non sono consapevoli del fatto che il loro codice presenta vulnerabilità di sicurezza critiche, il che è un fatto molto spaventoso non solo per i clienti, ma anche per te. Attualmente, gli sviluppatori possono essere ritenuti legalmente responsabili se la loro negligenza personale si traduce in un rischio per la sicurezza del database che viene poi sfruttato.
Nel caso in cui non sei convinto della serietà della sicurezza del database, questi due articoli dovrebbero aiutare a portare a casa il punto:
"L'FBI e la Virginia State Police sono alla ricerca di hacker che chiedano che lo stato paghi un riscatto da 10 milioni di dollari entro giovedì per il ritorno di milioni di documenti farmaceutici personali che dicono di aver rubato dal database dei farmaci con obbligo di prescrizione".
Leggi l'articolo sul Washington Post"Kaspersky Lab, una società di sicurezza con sede a Mosca, ha ammesso oggi che un database contenente informazioni sui clienti è stato esposto per quasi 11 giorni e che è venuto a conoscenza della violazione solo quando gli hacker rumeni ne hanno parlato alla società sabato scorso."
Leggi l'articolo ComputerWorld
Rivediamo un altro esempio usando lo pseudo-codice.
// Codice teorico txtUserName.setText ("eshafer 'OR 1 = 1"); query = "SELEZIONA nome utente, password Dagli utenti DOVE username = '" + txtUserName.getText () + "';"; // Final statement query = "SELEZIONA nome utente, password Dagli utenti DOVE username = ejshafer OR 1 = 1;"
Spero che abbiate guardato il codice sopra e notato la vulnerabilità. La query finirà per selezionare tutti i record di nome utente e password dalla tabella, perché 1 è sempre uguale a 1. Ora, questo particolare esempio non è molto utile per l'aspirante hacker. Tuttavia, esistono possibilità quasi illimitate di codice dannoso aggiuntivo che può essere aggiunto con risultati catastrofici.
La soluzione è spesso specifica per DBMS; cioè, varia tra MySQL, Oracle o SQL Server. Ad esempio, in PHP con MySQL, è normale uscire dai parametri usando la funzione mysql_real_escape_string prima di inviare la query SQL. In alternativa, puoi utilizzare le istruzioni preparate per "preparare" le tue domande. Fai della tua missione capire il DBMS con cui stai lavorando e i problemi inerenti la sicurezza.
L'iniezione SQL non è l'unica vulnerabilità di sicurezza per i database e gli sviluppatori di cui preoccuparsi, tuttavia, è uno dei metodi di attacco più comuni. È importante testare il codice e avere familiarità con gli ultimi problemi di sicurezza per il proprio DBMS al fine di proteggersi dagli attacchi.
Le istruzioni di selezione SQL a tabella singola sono piuttosto facili da scrivere. Tuttavia, i requisiti aziendali spesso impongono la necessità di scrivere query più complesse. Ad esempio, "trova tutti gli ordini per ciascun cliente e visualizza i prodotti per ciascun ordine". Ora, in questa particolare situazione, è probabile che ci sia una tabella clienti, una tabella ordini e una tabella order_line (l'ultima sarebbe quella di risolvere una possibile relazione tra record molti-a-molti). Per coloro che hanno un po 'più familiarità con SQL, è evidente che un join di tabella, in realtà, saranno necessari due join di tabella per questa query. Diamo un'occhiata ad alcuni codici di esempio.
SELECT customer.customerID, order.order_id, order_line.order_item FROM cliente INNER JOIN ordine ON customer.customerID = order.customerID INNER JOIN order_line ON order.orderID = order_line.orderID;
Va bene, abbastanza semplice. Per coloro che non sanno, il codice sopra è un join interno. Più specificamente, il codice sopra è un equi-join.
Definiamo i vari tipi di join.
Inner Joins: lo scopo principale dei join interni è restituire record corrispondenti.
Outer Joins: i join esterni non richiedono che ogni record abbia un record corrispondente.
Un ringraziamento speciale a Ronald Erdei per le immagini.
C'è un ultimo tipo di join che deve essere considerato, che è un self join. Un self join è semplicemente un join da un tavolo a se stesso.
TABELLA DEI DIPENDENTI -EmployeeName -SupervisorID
In questa situazione, per trovare quali dipendenti sono supervisionati da un determinato dipendente, sarebbe richiesto un self join.
Spero che questo chiarisca i principi di base dei join, in quanto sono una delle caratteristiche principali di SQL che rende un linguaggio di database così potente. Assicurati di utilizzare il join appropriato per la tua situazione specifica.
In SQL, in genere ogni colonna della tabella ha un tipo di dati associato. Testo, Integer, VarChar, Data e altro ancora sono in genere tipi disponibili per gli sviluppatori tra cui scegliere.
Durante lo sviluppo, assicurati di scegliere il tipo di dati corretto per la colonna. Le date dovrebbero essere variabili DATE, i numeri dovrebbero essere di tipo numerico, ecc. Ciò diventa particolarmente importante quando trattiamo un argomento successivo: indicizzazione; ma dimostrerò un esempio di scarsa conoscenza dei seguenti tipi di dati:
SELECT employeeID, employeeName FROM employee WHERE ID impiegato = 112457891;
Sembra corretto in base a ciò che sappiamo attualmente, corretto? Tuttavia, cosa succede se employeeID è in realtà una stringa. Ora abbiamo un problema, perché il DBMS potrebbe non trovare una corrispondenza (perché tipi di dati stringa e numeri interi sono tipi diversi).
Pertanto, se stai utilizzando l'indicizzazione, probabilmente rimarrai perplesso sul motivo per cui la query sta prendendo per sempre, quando dovrebbe essere una semplice scansione dell'indice. Questo è il motivo per cui gli sviluppatori devono prestare particolare attenzione ai tipi di dati e alle loro applicazioni. Gli attributi non chiave che sono ID sono spesso tipi di stringa, al contrario degli interi, a causa della maggiore flessibilità garantita. Tuttavia, questa è anche un'area problematica per gli sviluppatori junior, i quali ritengono che i campi ID saranno interi.
L'utilizzo corretto dei tipi di dati è essenziale per la corretta programmazione del database, poiché essi conducono direttamente all'efficienza delle query. Le query efficienti sono essenziali per la creazione di applicazioni scalabili e di qualità.
Tutti i linguaggi di programmazione hanno standard che gli sviluppatori web dovrebbero essere consapevoli e SQL non è diverso. SQL è stato standardizzato da ANSI e poi ISO, con nuove revisioni della lingua occasionalmente inoltrata. L'ultima revisione è SQL: 2008, anche se la revisione più importante di cui gli sviluppatori dovrebbero essere a conoscenza è SQL: 1999. La revisione del 1999 ha introdotto query ricorsive, trigger, supporto per PL / SQL e T-SQL e alcune funzionalità più recenti. Ha anche definito che le dichiarazioni JOIN devono essere eseguite nella clausola FROM, in contrasto con la clausola WHERE.
Quando si scrive codice, è importante tenere presente perché il codice conforme agli standard è utile. Ci sono due ragioni principali per cui vengono utilizzati gli standard. Il primo è la manutenibilità e il secondo è la standardizzazione multipiattaforma. Come per le applicazioni desktop, si presume che i siti Web abbiano una lunga durata di vita e passeranno attraverso vari aggiornamenti per aggiungere nuove funzionalità e problemi di riparazione. Come ogni analista di sistema dirà, i sistemi trascorrono gran parte della loro durata nella fase di manutenzione. Quando un programmatore diverso accede al tuo codice in 2, 5 o 10 anni, sarà ancora in grado di capire cosa sta facendo il tuo codice? Standard e commenti sono progettati per promuovere la manutenibilità.
L'altro motivo è la funzionalità multipiattaforma. Con i CSS, esiste attualmente una battaglia standard tra Firefox, Internet Explorer, Chrome e altri browser sull'interpretazione del codice. La ragione per gli standard SQL è di prevenire una situazione simile tra Oracle, Microsoft e altre varianti SQL come MySQL.
La normalizzazione del database è una tecnica per organizzare i contenuti dei database. Senza la normalizzazione, i sistemi di database possono essere inaccurati, lenti e inefficienti. La comunità dei professionisti del database ha sviluppato una serie di linee guida per la normalizzazione dei database. Ogni "livello" di normalizzazione viene definito come una forma e ci sono 5 forme, totale. La prima forma normale è il livello più basso di normalizzazione, fino alla quinta forma normale, che è il più alto livello di normalizzazione.
Nella realtà dello sviluppo del database, arrivare a 3NF è il salto più importante. 4NF e 5NF sono un po 'più di lusso (e talvolta un fastidio) nello sviluppo di database e raramente vengono visti nella pratica. Se stai lottando con i concetti, o ricordando le prime tre forme, c'è una semplice relazione. "La chiave, l'intera chiave e nient'altro che la chiave.", Che si riferisce a 1NF, 2NF e 3NF.
Ora, senza avventurarsi troppo nella teoria dei database, concentriamoci semplicemente sui benefici della normalizzazione. Man mano che i dati procedono attraverso i moduli di normalizzazione, diventa più pulito, meglio organizzato e più veloce. Ora, con un piccolo database con solo 5 tabelle e 100 righe di dati, questo non sarà immediatamente evidente. Tuttavia, man mano che il database cresce, gli effetti della normalizzazione diventeranno molto più evidenti per quanto riguarda la velocità e il mantenimento dell'integrità dei dati. Tuttavia, ci sono alcune situazioni in cui la normalizzazione non ha senso, ad esempio quando la normalizzazione dei dati creerà query eccessivamente complesse richieste per restituire i dati.
Ora, questo è un punto comunemente ignorato; in effetti, tutto il codice di esempio che ho dimostrato in questo tutorial ha sostanzialmente violato questo suggerimento. In termini di sviluppo del database, un nome oggetto completo si presenta come segue: DATABASE.schema.TABLE. Ora, vediamo perché i nomi completi sono importanti e in quali situazioni sono necessari. Lo scopo di un nome oggetto completo è quello di eliminare l'ambiguità. Gli sviluppatori principianti hanno raramente accesso a più database e schemi, il che complica i problemi in futuro. Quando un determinato utente ha accesso a più database, più schemi e le tabelle al suo interno, diventa fondamentale specificare direttamente ciò che l'utente sta tentando di accedere. Se hai una tabella dei dipendenti, il tuo capo ha una tabella dei dipendenti e lo schema su cui è in esecuzione la tua applicazione web ha una tabella dei dipendenti, che stai davvero tentando di accedere?
Logicamente, il nome completo sarebbe simile a DATABASE.SCHEMA.OBJECTNAME, tuttavia, sintatticamente (cioè, nelle istruzioni eseguibili), sarebbe semplicemente SCHEMA.OBJECTNAME. Sebbene vari DBMS abbiano diverse differenze di sintassi, lo stile sopra riportato è generalmente applicabile.
-- Non "SELECT * FROM table" SELECT * FROM schema.TABLE
La piena qualificazione dei nomi dei database è importante quando si lavora con database più grandi e utilizzati da più utenti e contenenti più schemi. Tuttavia, è una buona abitudine entrare.
Un indice di database è una struttura di dati che migliora la velocità delle operazioni su una tabella di database. Gli indici possono essere creati utilizzando una o più colonne di una tabella di database, fornendo la base per rapide ricerche casuali e un accesso efficiente ai record ordinati. L'indicizzazione è incredibilmente importante quando si lavora con tabelle di grandi dimensioni, tuttavia, a volte tabelle più piccole dovrebbero essere indicizzate, se si prevede che crescano. Le tabelle piccole che rimangono piccole, tuttavia, non devono essere indicizzate (ad esempio, se il tuo libro è di 1 pagina, ha senso passare all'indice?)
Molti sviluppatori scrivono il loro codice e lo testano su una tabella con 10 o 100 righe e sono soddisfatti quando il loro codice funziona in modo adeguato. Tuttavia, man mano che la tabella cresce a 10.000 o 1.000.000 di file, il codice rallenta a passo di lumaca e il client potrebbe anche uscire a pranzo in attesa dell'esecuzione del codice..
Quando una query cerca in un database un record corrispondente, ci sono due modi in cui la ricerca può essere eseguita.
È importante ricordare che gli indici devono essere ricostruiti occasionalmente, poiché i dati vengono aggiunti alla tabella. Inoltre, mentre gli indici aumentano le prestazioni di accesso ai dati, rallenta la modifica dei dati. Per questo motivo, la maggior parte dei DBMS ha un'opzione per disabilitare temporaneamente un indice per facilitare la modifica dei dati di massa, e quindi permetterne la riabilitazione e la ricostruzione successiva.
Quando si lavora con un database che ha più utenti, è importante gestire correttamente le varie autorizzazioni del database. Ovviamente, la maggior parte dei database ha un utente amministratore, ma ha sempre senso eseguire le query come amministratore? Inoltre, vorresti fornire a tutti i tuoi sviluppatori e utenti junior le credenziali dell'amministratore per scrivere le loro domande? Molto probabilmente no. Le varie autorizzazioni possibili per il tuo database dipendono dal tuo DBMS, ma ci sono temi comuni tra di loro.
In MySQL, ad esempio, digitando "SHOW TABLES" verrà visualizzato un elenco di tabelle nel database, di cui si noterà probabilmente una tabella "utente". Digitando 'utente DESC' si rivelerà che ci sono vari campi nella tabella utente. Insieme a un host, nome utente e password, esiste anche un elenco di privilegi che possono essere impostati per un utente. Inoltre, esiste una tabella 'db' che governa più privilegi per un database specifico.
SQL Server fornisce le istruzioni GRANT, DENY e REVOKE per fornire o rimuovere autorizzazioni da un utente o un ruolo. Inoltre, SQL Server fornisce ruoli come db_writer, db_reader. Spesso, gli sviluppatori non consapevoli concedono questi ruoli (anziché creare i propri ruoli personalizzati) ad altri utenti, con conseguente sicurezza generale del database ridotta, nonché la possibilità che un utente esegua un'operazione indesiderata.
La corretta gestione delle autorizzazioni dell'utente del database è essenziale per gestire non solo la sicurezza, ma anche fornire una base per uno sviluppo più rapido e la protezione dell'integrità dei dati.
I database sono strumenti potenti, tuttavia, non sono senza limiti. Oracle, SQL Server e MySQL hanno tutti limitazioni uniche su cose come dimensioni massime del database, numero massimo di tabelle e altro. Molti sviluppatori scelgono inconsapevolmente una soluzione DBMS per il loro progetto senza pianificare o considerare i successivi requisiti del loro database.
Fare riferimento al manuale DBMS per le varie limitazioni, ad esempio, le limitazioni di SQL Server si trovano sul sito Web MSDN: http://msdn.microsoft.com/en-us/library/ms143432.aspx
In questo articolo abbiamo esaminato 10 suggerimenti essenziali per gli sviluppatori SQL. Tuttavia, ci sono molte altre tecniche SQL utili che potrebbero essere menzionate; quindi per favore lasciate i vostri pensieri nei commenti, se pensate che questo articolo abbia trattato tutti gli argomenti essenziali, o pensate che ne sia stato tralasciato uno. Continua a sviluppare, e ricorda, il codice che scrivi supporta l'infrastruttura di Internet e, senza di te, Internet non avrà lo stesso successo.