10 sfaturi esențiale SQL pentru dezvoltatori

SQL este încă o altă limbă esențială pentru dezvoltatorii care doresc să creeze site-uri web bazate pe date. Cu toate acestea, mulți dezvoltatori nu sunt familiarizați cu diferite aspecte ale SQL; astfel încât în ​​acest articol, vom analiza zece sfaturi esențiale.

1. Folosiți limba corectă

Dezvoltatorii web au adesea o mulțime de limbi la dispoziția lor. Este esențial ca dezvoltatorii să folosească limba adecvată pentru acest loc de muncă.

Să examinăm următorul cod. În primul exemplu, dezvoltatorul selectează toate coloanele și toate rândurile din tabelul clientului. În al doilea exemplu, dezvoltatorul este selectarea doar prenumele, numele și adresa de la masa de client pentru un singur client cu ID-ul 1001. Nu numai că limitează a doua interogare coloanele care sunt returnate, va efectua, de asemenea o mai bună.

 SELECT * FROM client;
 SELECT numeName, lastName, shippingAddress FROM client WHERE clientID = 1001;

Când scrieți un cod, asigurați-vă că funcționează eficient.

Prea mulți dezvoltatori sunt mulțumiți de codul care se comportă în mod adecvat pe 100 de rânduri de date, fără să se gândească la momentul în care baza de date va avea 10.000 de rânduri.

2. Asigurați-vă codul

Bazele de date stochează informații valoroase. Din acest motiv, bazele de date sunt adesea obiective principale pentru atac. Mulți dezvoltatori nu sunt conștienți de faptul că codul lor are vulnerabilități critice de securitate, ceea ce este un fapt foarte înspăimântător nu numai pentru clienți, ci și pentru dvs. În prezent, dezvoltatorii pot fi trași la răspundere legal dacă propria lor neglijență personală generează un risc de securitate a bazei de date care este apoi exploatat.

În cazul în care nu sunteți convins de seriozitatea securității bazei de date, aceste două articole ar trebui să vă ajute să conduceți punctul de acasă:

„FBI și Poliția de stat Virginia caută hackeri care au cerut ca statul să plătească o răscumpărare de 10 milioane $ de joi pentru returnarea a milioane de inregistrari farmaceutice personale pe care le spun au furat din baza de date de droguri baza de prescriptie a statului.“
Citiți articolul din Washington Post

„Kaspersky Lab, o companie de securitate cu sediul la Moscova, a recunoscut astăzi că o bază de date care conține informații despre clienți au fost expuse timp de aproape 11 de zile și că a aflat doar a încălcării, atunci când hackerii români au declarat firmei cu privire la aceasta sambata trecuta.“
Citiți articolul ComputerWorld

Să examinăm un alt exemplu folosind pseudo-cod.

 // Codul teoretic txtUserName.setText ("eshafer 'OR 1 = 1"); query = "SELECT nume de utilizator, parola de la utilizatori WHERE username = '" + txtUserName.getText () + "';"; // interogare declarație finală = "SELECT numele de utilizator, parola de la utilizatori WHERE username = ejshafer SAU 1 = 1;"

Sperăm că te-ai uitat la codul de mai sus și ai observat vulnerabilitatea. Interogarea va termina prin selectarea tuturor înregistrărilor de nume de utilizator și de parole din tabel, deoarece 1 este întotdeauna egală cu 1. Acum, acest exemplu special nu realizează prea mult pentru potențialul hacker. Cu toate acestea, există posibilități aproape nelimitate pentru un cod malware suplimentar care poate fi adăugat cu rezultate catastrofale.

Cum puteți scrie cod securizat?

Soluția este adesea specifică DBMS; care este, variază între MySQL, Oracle sau SQL Server. În PHP cu MySQL, de exemplu, este obișnuit să scăpați parametrii folosind funcția mysql_real_escape_string înainte de a trimite interogarea SQL. Alternativ, puteți utiliza instrucțiuni pregătite pentru a "pregăti" interogările dvs. Faceți-vă misiunea de a înțelege SGBD-ul cu care lucrați și problemele de securitate inerente.

Injecția SQL nu este singura vulnerabilitate de securitate pentru bazele de date și dezvoltatorii care trebuie să-și facă griji, este totuși una dintre cele mai comune metode de atac. Este important să vă testați codul și să fiți familiarizat cu cele mai recente probleme de securitate pentru SGBD, pentru a vă proteja împotriva atacurilor.

3. Înțelegeți conexiunile

Exemplele SQL selectate ale unei tabele simple sunt destul de ușor de scris. Cu toate acestea, cerințele afacerii dictă adesea că trebuie să fie scrise mai multe întrebări complexe. De exemplu, "găsiți toate comenzile pentru fiecare client și afișați produsele pentru fiecare comandă". Acum, în această situație particulară, ar fi probabil că există un tabel client, un tabel de comandă și un tabel order_line (ultima ar fi pentru a rezolva o posibilă relație de înregistrare de la multe la mai multe). Pentru cei care sunt puțin mai familiarizați cu SQL, este evident că o masă se alătură, de fapt, două îmbinări de tabelă vor fi necesare pentru această interogare. Să ne uităm la un exemplu de cod.

 SELECT customer.customerID, order.order_id, order_line.order_item de la client INTERIOARĂ ÎNSCRIEȚI comanda de pe customer.customerID = order.customerID INTERIOARĂ TE order_line PE order.orderID = order_line.orderID;

Destul de simplu. Pentru cei care nu știu, codul de mai sus este o intrare internă. Mai exact, codul de mai sus este un equi-join.
Să definim diferitele tipuri de conexiuni.

Inner Joins: Scopul de bază al îmbinărilor interioare este de a returna înregistrările potrivite.

Îmbinările exterioare: Legăturile externe nu necesită ca fiecare înregistrare să aibă o înregistrare corespunzătoare.

  • Îmbinarea exterioară a stângii: o îmbinare exterioară stângă a tabelelor A și B va returna toate înregistrările potrivite ale lui A și B, precum și orice înregistrări neconforme din tabelul stâng, în acest caz A.
  • Exemplu exterior exterior: o îmbinare exterioară dreaptă a tabelelor A și B va returna toate înregistrările potrivite ale lui A și B, precum și orice înregistrări neconforme din tabelul din dreapta, în acest caz B.
  • Intrarea totală exterioară: o îmbinare completă exterioară a tabelelor A și B va returna toate înregistrările potrivite ale lui A și B, precum și orice înregistrări neconforme din ambele tabele.

Mulțumiri speciale lui Ronald Erdei pentru imagini.

Sinele se unește

Există un ultim tip de asociere care trebuie luat în considerare, ceea ce este o aderare. O singură aderare este doar o adunare dintr-o masă spre ea însăși.

 TABLE-EMPLOYEE-Numele angajatului -ServiciuID

În această situație, pentru a afla care angajați sunt supravegheați de un anumit angajat, ar fi necesară o aderare.

Sperăm că acest lucru clarifică principiile de bază ale conexiunilor, deoarece acestea sunt una dintre caracteristicile principale ale SQL care o fac o astfel de limbă de baze de date puternice. Asigurați-vă că utilizați conexiunea adecvată pentru situația dată.

4. Cunoașteți tipurile de date

În SQL, de obicei fiecare coloană de tabelă are un tip de date asociat. Textul, Integerul, VarChar, Data și multe altele, sunt în mod tipic disponibile pentru dezvoltatori de a alege.

  • MySQL Tipuri de date
  • Tipuri de date Oracle
  • Tipuri de date SQL Server

În curs de dezvoltare, asigurați-vă că alegeți tipul corect de date pentru coloană. Datele ar trebui să fie DATE variabile, numere ar trebui să fie un tip numeric, etc Acest lucru devine deosebit de important atunci când ne ocupăm de un subiect mai târziu: indexarea; dar voi demonstra un exemplu de cunoaștere slabă a tipurilor de date de mai jos:

 SELECT employeeID, employeeName FROM angajat WHERE employeeID = 112457891;

Se pare bine pe baza a ceea ce știm în prezent, corect? Cu toate acestea, ce dacă employeeID este de fapt un șir. Acum avem o problemă, deoarece SGBS ar putea să nu găsească o potrivire (deoarece tipurile de date șir și întregi sunt diferite tipuri).

Prin urmare, dacă utilizați indexarea, probabil că veți fi nedumerit de ce interogarea dvs. durează pentru totdeauna, când ar trebui să fie o simplă indexare. Acesta este motivul pentru care dezvoltatorii trebuie să acorde o atenție deosebită tipurilor de date și aplicațiilor acestora. Atributele non-cheie care sunt ID-uri sunt de multe ori tipuri de șir, spre deosebire de întregi, datorită flexibilității sporite acordate. Cu toate acestea, aceasta este, de asemenea, o zonă de probleme pentru dezvoltatorii juniori, care presupun că câmpurile ID vor fi numere întregi.

Folosirea corectă a tipurilor de date este esențială pentru programarea corectă a bazelor de date, deoarece acestea conduc direct la eficiența interogării. Interogările eficiente sunt esențiale pentru crearea de aplicații de calitate, scalabile.

5. Scrieți codul conform

Toate limbile de programare au standarde pe care dezvoltatorii web trebuie să le cunoască, iar SQL nu este diferit. SQL a fost standardizat de ANSI și apoi de ISO, cu noi revizuiri ale limbajului fiind în mod ocazional depuse. Ultima revizuire este SQL: 2008, deși cea mai importantă revizie pe care dezvoltatorii ar trebui să o cunoască este SQL: 1999. Revizuirea din 1999 a introdus interogări recursive, declanșatoare, suport pentru PL / SQL și T-SQL și câteva caracteristici noi. De asemenea, a definit că declarațiile JOIN se fac în clauza FROM, spre deosebire de clauza WHERE.

Când scrieți un cod, este important să rețineți de ce codul care respectă standardele este util. Există două motive primare pentru utilizarea standardelor. Primul este mentenabilitatea, iar al doilea este standardizarea pe mai multe platforme. Ca și în cazul aplicațiilor desktop, se presupune că site-urile web vor avea o durată lungă de viață și vor trece prin diferite actualizări pentru a adăuga noi funcționalități și a repara problemele. După cum vă va spune orice analist de sistem, sistemele petrec majoritatea duratei de viață în faza de întreținere. Atunci când un alt programator accesează codul dvs. în 2, 5 sau 10 ani, va fi în continuare capabil să înțeleagă ce face codul dvs.? Standardele și comentariile sunt concepute pentru a promova mentenabilitatea.

Celălalt motiv este funcționalitatea cross-platform. Cu CSS, există în prezent o luptă standard între Firefox, Internet Explorer, Chrome și alte browsere despre interpretarea codului. Motivul standardelor SQL este de a preveni o situație similară între Oracle, Microsoft și alte variante SQL, cum ar fi MySQL.

6. Normalizați-vă datele

Baza de date este o tehnică de organizare a conținutului bazelor de date. Fără normalizare, sistemele de baze de date pot fi inexacte, lente și ineficiente. Comunitatea profesioniștilor din baze de date a elaborat o serie de linii directoare pentru normalizarea bazelor de date. Fiecare "nivel" de normalizare este denumit formă și există 5 forme, total. Prima formă normală este cel mai scăzut nivel de normalizare, până la a cincea formă normală, care este cel mai înalt nivel de normalizare.

  • Primul Normal Forma (1NF): nivelul cel mai de bază de normalizare a datelor, prima formă normală necesită eliminarea tuturor coloanelor duplicat într-un tabel, și, de asemenea, presupune crearea unor tabele separate pentru datele aferente, precum și identificarea fiecărui tabel cu o cheie primară atribut.
  • A doua formă normală (2NF): îndeplinește toate cerințele primei forme normale și creează relații între tabele utilizând chei străine.
  • A treia formă normală (3NF): îndeplinește toate cerințele formularelor secundare și prime normale și elimină toate coloanele care nu depind de cheia primară. A treia formă normală elimină, de asemenea, toate atributele derivate, cum ar fi vârsta.
  • Forma a patra normală (4NF): Forma normală a patra adaugă o cerință suplimentară, care este eliminarea oricăror dependențe multi-evaluate în relații.
  • Cincea formă normală (5NF): Forma normală a cincea este o formă mai rară de normalizare, caz în care dependențele de asociere sunt implicate de cheile candidate (eventual valori ale cheilor primare).

În realitatea dezvoltării bazei de date, ajungerea la 3NF este cel mai important salt. 4NF și 5NF sunt un pic mai mult de un lux (și, uneori, o provocare) în dezvoltarea bazei de date și sunt rareori văzute în practică. Dacă vă luptați cu conceptele sau amintiți primele trei forme, există o relație simplă. "Cheia, întreaga cheie și nimic altceva decât cheia", care se referă la 1NF, 2NF și 3NF.

Beneficiile normalizării

Acum, fără a se aventura prea mult în teoria bazelor de date, să ne concentrăm pur și simplu asupra beneficiilor normalizării. Pe măsură ce datele progresează prin formele de normalizare, ele devin mai curate, mai bine organizate și mai rapide. Acum, cu o bază de date mică care are doar 5 tabele și 100 de rânduri de date, acest lucru nu va fi evident. Cu toate acestea, pe măsură ce crește baza de date, efectele normalizării vor deveni mult mai evidente în ceea ce privește viteza și menținerea integrității datelor. Cu toate acestea, există câteva situații în care normalizarea nu are sens, cum ar fi atunci când normalizarea datelor va crea interogări excesiv de complexe necesare pentru returnarea datelor.

7. Calificați complet numele de obiecte de bază de date

Acum, acesta este un moment frecvent ignorat; de fapt, tot exemplul de cod pe care l-am demonstrat în acest tutorial a încălcat în mod esențial acest sfat. În ceea ce privește dezvoltarea bazei de date, un nume de obiect complet calificat arată după cum urmează: DATABASE.schema.TABLE. Acum, să ne uităm de ce numele deplin calificate sunt importante și în ce situații sunt necesare. Scopul unui nume de obiect complet calificat este eliminarea ambiguității. Dezvoltatorii încep să aibă rareori acces la mai multe baze de date și scheme, ceea ce complică problemele în viitor. Atunci când un anumit utilizator are acces la mai multe baze de date, la mai multe scheme și la tabelele din acestea, devine crucială specificarea directă a ceea ce utilizatorul încearcă să acceseze. Dacă aveți un tabel de angajați, șeful dumneavoastră are un tabel de angajați, iar schema pe care rulează aplicația dvs. web are un tabel de angajați, pe care încercați cu adevărat să îl accesați?

În mod logic, numele complet calificat ar arăta ca DATABASE.SCHEMA.OBJECTNAME, cu toate acestea, în mod sintactic (adică, în instrucțiunile executabile), ar fi pur și simplu SCHEMA.OBJECTNAME. Deși diverse DBMS-uri au diferite diferențe de sintaxă, stilul de mai sus este în general aplicabil.

 -- Nu este "SELECT * FROM tabel" SELECT * FROM schema.TABLE

Calificarea completă a numelor de baze de date este importantă atunci când lucrați cu baze de date care sunt mai mari și sunt utilizate de mai mulți utilizatori și conțin mai multe scheme. Cu toate acestea, este un obicei bun pentru a intra în.

8. Înțelegerea indexării

Un index de bază de date este o structură de date care îmbunătățește viteza operațiilor pe o tabelă de baze de date. Indicii pot fi creați utilizând una sau mai multe coloane dintr-o tabelă de baze de date, oferind baza atât pentru căutări rapide aleatoare, cât și pentru accesul eficient al înregistrărilor ordonate. Indexarea este incredibil de importantă atunci când lucrați cu mese mari, cu toate acestea, ocazional tabele mai mici ar trebui să fie indexate, dacă se așteaptă să crească. Tabelele mici care rămân mici, cu toate acestea, nu ar trebui indexate (de exemplu, dacă cartea dvs. este de 1 pagină, este logic să vă îndreptați către index?)

Mulți dezvoltatori își scriu codul și îl testează pe un tabel cu 10 sau 100 rânduri și sunt satisfăcuți atunci când codul lor funcționează în mod adecvat. Cu toate acestea, pe măsură ce tabelul crește la 10.000 sau 1.000.000 de rânduri, codul încetinește ritmul melcului, iar clientul poate merge la prânz așteptând executarea codului.

Atunci când o interogare caută o bază de date pentru o înregistrare de potrivire, există două moduri în care poate fi efectuată căutarea.

  • Primul și cel mai lent mod este o scanare de masă. Într-o scanare de masă, interogarea caută fiecare înregistrare din tabel în căutarea unei potriviri.
  • Cea de-a doua și cea mai rapidă este o scanare index. Într-o scanare index, interogarea caută indexul pentru a găsi înregistrarea. În termeni care nu țin de bază de date, o scanare de tabel ar echivala cu citirea fiecărei pagini dintr-o carte care caută un cuvânt, în timp ce o scanare index ar fi echivalentul unei răsturnări în partea din spate a cărții, găsirea cuvântului, , apoi citiți cuvintele de pe pagină pentru a găsi cuvântul.

Este important să rețineți că indexurile trebuie să fie reconstruite ocazional, deoarece datele sunt adăugate în tabel. În plus, în timp ce indexurile sporesc performanța accesului la date, aceasta încetinește modificarea datelor. Din acest motiv, cele mai multe DBMS-uri au opțiunea de a dezactiva temporar un index pentru a facilita modificarea datelor de masă și apoi a permite re-activarea și reconstruirea ulterioară.

9. Utilizarea corectă a permiselor de bază de date

Când lucrați cu o bază de date care are mai mulți utilizatori, este important să se gestioneze corect diferitele permisiuni de bază de date. Evident, majoritatea bazelor de date au un utilizator de administrator, dar are întotdeauna sens să-ți rulez interogările ca administrator? În plus, doriți să oferiți tuturor dezvoltatorilor și utilizatorilor dvs. de juniori acreditările de administrator pentru a-și scrie interogările? Cel mai probabil nu. Diferitele permisiuni posibile pentru baza de date depind de DBMS-ul dvs., dar există teme comune între ele.

În MySQL, de exemplu, tastând "SHOW TABLES" va apărea o listă de tabele din baza dvs. de date, despre care probabil veți observa o tabelă "utilizator". Tastarea "DESC user" va arăta că există mai multe câmpuri în tabela utilizatorului. Împreună cu o gazdă, nume de utilizator și o parolă, există și o listă de privilegii care pot fi setate pentru un utilizator. În plus, există o tabelă "db" care reglementează mai multe privilegii pentru o bază de date specifică.

SQL Server furnizează declarațiile GRANT, DENY și REVOKE pentru a da sau a îndepărta permisiunile unui utilizator sau unui rol. În plus, SQL Server oferă roluri precum db_writer, db_reader. Adesea, dezvoltatorii necunoașteri acordă acestor roluri (spre deosebire de a-și crea propriile roluri personalizate) altor utilizatori, ceea ce duce la scăderea globală a securității bazei de date, precum și posibilitatea ca un utilizator să efectueze o operație nedorită.

Administrarea corectă a permisiunilor utilizatorilor de baze de date este esențială pentru gestionarea securității, dar și pentru asigurarea unei dezvoltări mai rapide și a protejării integrității datelor.

10. Cunoașteți limitările DBMS

Bazele de date sunt instrumente puternice, cu toate acestea, ele nu sunt fără limitări. Oracle, SQL Server și MySQL au toate limitări unice asupra unor elemente cum ar fi dimensiunile maxime ale bazelor de date, numărul maxim de tabele și altele. Mulți dezvoltatori aleg în mod inconștient o soluție DBMS pentru proiectul lor, fără să planifice sau să ia în considerare cerințele ulterioare ale bazei lor de date.

Consultați manualul DBMS pentru diferitele limitări, de exemplu, limitările SQL Server sunt localizate pe site-ul MSDN: http://msdn.microsoft.com/en-us/library/ms143432.aspx

Concluzie

În acest articol, am revizuit 10 sfaturi esențiale pentru dezvoltatorii SQL. Cu toate acestea, există multe alte tehnici SQL utile care ar putea fi menționate; deci vă rugăm să vă lăsați gândurile în comentarii, indiferent dacă credeți că acest articol a acoperit toate subiectele esențiale, sau credeți că unul a fost lăsat afară. Continuați să vă dezvoltați și să vă amintiți că codul pe care îl scrieți susține infrastructura internetului, iar fără dvs. internetul nu ar fi la fel de reușit ca și cum ar fi.

  • Urmăriți-ne pe Twitter sau abonați-vă la feed-ul RSS NETTUTS pentru mai multe tutoriale și articole zilnice de dezvoltare web.


Cod