Conceptele Bazelor de Date Relaţionale
Definirea bazei de date
Prin intermediul calculatoarelor electronice se pot realiza activităţi precum stocare, interogare şi administrare de colecţii de date. Prin intermediul tehnologiilor informaţionale se pot definii tehnici şi metode de oraganizare a colecţiilor de date. Organizarea în fişiere de date şi organizarea în baze de date sunt două din metodele cunoscute. Prin anii 1960 se folosea organizarea datelor în fişiere de date, dar această metodă are şi unele neajunsuri şi limitări din care se poate menţiona urmatoarele:
Datele sunt dependente de program, deci trebuie să se facă descrierea datelor în fiecare program în care sunt utilizate
Există redundanţe ridicate în cadrul colecţiilor de date
Performanţe scăzute în procesarea datelor
Pentru a se limita aceste neajunsuri şi limitări ale datelor organizate în fişiere de date au fost dezvoltate alte metode de organizare a datelor şi anume organizarea datelor în baze de date.
Definiţie: O bază de date este o colecție de informații care este organizată în așa fel încât să poată fi ușor de accesat, gestionat și actualizat.
Diferenţa între metoda de organizare a datelor în fişiere de date şi cea de organizare a datelor în baze de date este că în cea din urmă (organizarea datelor în baze de date) exiată un fişier de descriere generală a bazei, iar în acest fel se poate realiza independenţa programelor faţă de date. Acest fişier care face o descriere generală (globală) a bazei se numeşte dicţionar de date. Ca atare modificarea datelor sau extragerea acestora se face prin intermediul acestui dicţionar de date în care găsim informaţii referitoare la structura datelor.
De multe ori termenul de “bază de date” este înţeles şi utilizat greşit şi se confundă cu softul de baze de date care se utilizează. De fapt softul pentru baze de date se numeşte sistem de gestiune al bazelor de date (SGBD), iar baza de date este containierul (daca putem sa facem o analogie ca să întelegem mai bine diferenta dintre o bază de date şi un SGBD) care conţine informaţiile, iar acest containier este creat şi gestionat prin intermediul SGBD. Nu orice colecţie de date este o bază de date. Proiectarea unei baze de date înseamna să îi stabilim structura, caracteristicile, elementele componente acesteia, precum şi restricţiile care trebuie respectate şi relaţiile dintre ele.
A construi o bază de date înseamnă să introducem datele noastre în baza de date dupa ce am proiectat-o. A administra o bază de date înseamnă să asigurăm accesul utilizatorilor la date în funcţie de drepturile pe care le-am acordat fiecaruia. A interoga o bază de date înseamnă a extrage şi vizualiza acele date care îndeplinesc anumite condiţii dupa care am facut căutarea. După cum spuneam nu orice colecţie de date este o bază de date, de exemplu lista filmelor unui magazin care are ca activitate închirierea de filme clienţilor nu este o bază de date, ci este doar un simplu tabel sau o listă. Deci o bază de date diferă de un simplu tabel şi trebuie să aibă anumite proprietăţi cum ar fi:
Este o colecţie de date coerentă din punct de vedere al logicii
Este proiectată, construită şi administrată având un scop bine determinat
Reprezintă anumite aspecte ale lumii reale
O bază de date poate fi înţeleasă ca o colecţie de fişiere asociate. Modul în care aceste fişiere sunt asociate depinde de modelul utilizat. Primele modele au inclus modelul ierarhic (caz în care fişierele sunt asociate într-un mod părinte / copil, cu fiecare fişier copil având cel mult un fişier părinte), precum şi modelul de reţea ( caz în care fisierele sunt asociate ca proprietari şi membrii, similar cu modelul de reţea, cu excepţia că fiecare fişier membru poate avea mai mult de un proprietar).
Să luăm exemplu următoarele două tabele:
Aceste două tabele sunt legate printr-o relaţie de referinţă, câmpul „COD” din tabelul „Autori” şi câmpul „AUTOR” din tabelul „Lucrări”. Putem vedea cine a scris lucrarea „Linux pentru începatori” urmând relaţia de referintă, din care reiese că autorul este „2” din tabelul „Lucrări” adică Dumitru George din tabelul „Autori”.
O bază de date relaţională este un sistem în care datele sunt stocate în tabele de rânduri (înregistrări) şi coloane (câmpuri). Caracteristica definitorie a unei baze de date relaţională este faptul că un set complet de date este divizat în mai multe tabele (fiecare reprezentând un singur subiect) şi relaţiile pot fi stabilite între aceste tabele prin utilizarea de domenii cheie.
Structured Query Language (SQL) este folosit într-un SGBD pentru a manipula datele din tabele. Există mai multe pachete software de SGBD pe care putem să le alegem. În domeniul comercial, Oracle a fost mult timp cel mai popular SGBD, urmat de IBM DB2 şi Microsoft SQL Server. În domeniul open-source, MySQL şi PostgreSQL sunt cele mai importante SGBD. Microsoft Access este un pachet relativ ieftin, care este cel mai potrivit pentru seturi mici de date.
În 1970, atunci când E.F. Codd a dezvoltat modelul, acesta a fost considerat a fi nepractic, deoarece maşinile din acea perioadă nu puteau face faţă cerinţelor hardware necesare. Desigur, de atunci hardware-ul a făcut progrese uriaşe, astfel încât astăzi chiar şi cele mai modeste PC-uri pot rula sisteme sofisticate de SGBD. Odată cu aceasta a fost dezvoltat şi limbajul SQL. SQL este relativ usor de învăţat şi permite oamenilor să înveţe rapid cum să efectueze interogări pe o bază de date relaţională.
O înţelegere a bazelor de date relaţionale necesită o înţelegere a unora dintre termenii de bază. Datele sunt valorile stocate în baza de date. Ca atare, datele înseamnă foarte puţin. “12345” este un exemplu Informaţiile sunt date care sunt prelucrate pentru a avea un sens. De exemplu, “637500”, este populaţia oraşului Brasov.
O bază de date este o colecţie de tabele. Fiecare tabel conţine înregistrări, care sunt rândurile orizontale din tabel. Acestea sunt, de asemenea, numite tupluri. Fiecare înregistrare conţine câmpuri, care sunt coloanele verticale ale tabelului. Acestea sunt, de asemenea, numite atribute. Câmpurile pot fi de mai multe tipuri diferite. Există mai multe tipuri de date standard, iar fiecare SGBD (sistem de management de baze de date, cum ar fi Oracle sau MySQL) au de asemenea, propriile tipuri specifice de date, dar în general, acestea se încadrează în cel puţin trei tipuri, caracter, numeric şi data.
Domeniul se referă la valorile posibile pentru fiecare câmp. De exemplu, un câmp denumit “gen” poate fi limitat la valorile “masculin” si “feminin”.
Un câmp conţine o valoare „NULL” atunci când câmpul nu conţine nimic, adica o valoare necunoscută de exemplu. Câmpurile pot crea complexităţi în calcule şi au consecinţe pentru exactitatea datelor. Din acest motiv, multe câmpuri sunt în mod special setate să nu conţină valori „NULL”.
O cheie este o modalitate logică de a accesa o înregistrare într-un tabel. De exemplu, într-un tabel numit „AUTORİ”, câmpul „COD” ar putea să ne permită să identificăm unic o înregistrare. O cheie care identifică în mod unic o înregistrare se numeşte cheie primară.
Un index este un mecanism fizic care îmbunătăţeste performanţa unei baze de date. Indexurile sunt adesea confundate cu chei. Cu toate acestea, strict vorbind ei sunt parte a structurii fizice, în timp ce cheile sunt parte a structurii logice. O vizualizare este un tabel virtual alcătuit dintr-un subset de tabele reale (concrete).
O relaţie unu-la-unu (1:1) în cazul în care are loc relaţia, pentru fiecare instanţă a tabelului A, numai o instanţă din tabelul B există, si vice-versa.
O relaţie unu-la-mai-mulţi (1: m) în cazul în care relaţia există, pentru fiecare instanţă a tabelului A, mai multe instanţe a tabelului B există, dar pentru fiecare instanţă din tabelul B, numai o singură instanţă a tabelului A există.
O relaţie mulţi pentru mulţi (m: n) în cazul în care are loc relaţia, pentru fiecare instanţă a tabelului A, există mai multe instante a tabelului B, iar pentru fiecare instanţă a tabelului B, există mai multe instante ale tabelului A.
O relaţie este opţională în cazul în care, pentru fiecare instanţă a tabelului A, pot exista instanţe ale tabelului B
İntegritatea datelor descrie acurateţea, validitatea şi coerenţa datelor. Un exemplu de integritate slabă ar fi în cazul în care numele unui autor este stocat în mod diferit în două locuri diferite.
Normalizarea bazei de date este o tehnică care ne ajută la reducerea apariţiei anomaliilor de date şi slaba integritate a datelor.
Modelul relaţional constă din următoarele:
O colecţie de obiecte sau relaţii
Un set de operatori care acţionează asupra relaţiilor
İntegritate a datelor pentru acurateţe şi consecvenţă
Componente ale modelului relaţional:
Colecţii de obiecte sau relaţii care stochează datele
Un set de operatori care pot acţiona asupra relaţiilor pentru a produce alte relaţii
İntegritatea datelor pentru acurateţe şi consecvenţăO bază de date relaţională este o colecţie de relaţii sau tabele bidimensionale utilizate pentru a stoca informaţii.
De exemplu, putem avea nevoie să stocam informaţii despre toţi angajaţii dintr-o anumită companie. Într-o bază de date relaţională, putem crea mai multe tabele pentru a stoca diferite bucăţi de informaţii despre angajaţi cum ar fi un tabel cu toţi angajaţii, un tabel cu angajaţii dintr-un anumit departament precum şi un tabel cu salariul fiecarui angajat dintr-un anumit departament.
Proprietăţile bazelor de date relaţionale.
O bază de date relatională:
Poate fi accesată şi modificată executând instrucţiuni ale limbajului Structured Query Language (SQL)
Conţine o colecţie de tabele fără indicii fizice
Utilizează un set de operatoriÎn baza de date relaţională, nu e necesar să specificăm calea de acces la tabele, nici nu trebuie să ştim modul în care datele sunt aranjate fizic. Pentru a accesa baza de date, executam pur şi simplu o interogare a limbajului SQL, care este conform American National Standard Institute (ANSI) limbajul standard pentru baze de date relaţionale. Limbajul conţine un set larg de operatori pentru partiţionare şi combinarea relaţiilor. Bazele de date pot fi modificate cu ajutorul declaraţiilor SQL.
Limbajul de interogare structurat SQL ne permite să comunicăm cu serverul şi are urmatoarele avantaje:
Eficienţă
Uşor de învăţat şi folosit
Funcţionalitate completă (SQL ne permite să definim, regăsim şi să manipulăm datele în tabele)Entitate
O entitate poate să fie un obiect din lumea înconjurătoare care are o existenţă fizică, sau mai poate fi un obiect care are o existenţă abstractă, conceptuală. O entitate poate să fie dependentă (slabă) şi în acest caz depinde de alte entităţi, sau independentă adică (tare) şi atunci nu mai depinde de alte entităţi.
Observatii:
Entitaţile sunt tabele în modelele de date relaţionale
Entitaţile se scriu cu litere mari
Sunt substantive, dar nu orice substantiv este o entitate
Prin intermediul cheii primare identificam unic o entitate,cheia primară trebuie să fie unică
Este nevoie de o descriere detaliată a fiecarei entitaţi
Nu putem avea doua entitaţi cu acelaşi nume într-o diagramă, sau să avem nume diferite pentru aceeaşi entitateRelatie
Când proiectam o bază de date, modelăm un sistem care există în lumea reală, acesta descrie mai multe entități care au anumite caracteristici, sau atribute și de asemenea există anumite reguli şi legături între aceste entități. O relație descrie modul în care entitățile sunt legate una de alta. Relațiile pot fi considerate verbe care leagă două sau mai multe substantive.
Relații unu-la-unu: În acest tip de relație, fiecare instanță a unei entități se referă la o singură instanță a unei alte entități. Deci, există un raport de unu-la-unu one-to-one (1:1).
Relații unu-la-mai-mulți: În acest tip de relație, fiecare instanță a unei entități se referă la una sau mai multe instanțe ale unei alte entități. De exemplu, un autor ar fi scris mai multe cărți, dar anumite cărți au un singur autor. Acesta este cel mai comun tip de relație modelat în baze de date relaționale one-to-many (1:n).
Relații mulți-la-mai-mulți: În acest tip de relație, mai multe instanțe ale unei anumite entitaţi se referă la una sau mai multe instanțe ale unei alte entități. De exemplu, co-autorii ar putea scrie o serie de cărți many-to-many (m:n).
Observatii:
În modelul relaţional, relaţiile devin tabele speciale sau coloane care referă chei primare.
Se face o descriere pentru fiecare relaţie.
Putem avea relaţii diferite cu acelaşi nume în aceeaşi diagramă, dar în acest caz, acestea sunt diferenţiate de entităţile care sunt asociate prin relaţia respectivă
Trebuie să stabilim cardinalitatea pentru fiecare relaţie (maximă şi minimă), adică numărul de înregistrari ce aparţin relaţiei.Atributul
Este o proprietate care descrie o relaţie sau o entitate. De exemplu numele unui film este atribut al entităţii FILM_STOC, iar preţul de închiriere a unui film este un atribut al relaţiei “închiriază” ce leaga entitaţile FILM_STOC şi FILME_INCHIRIATE.
Atributele pot să fie simple (ex. pretul cu care este închiriat un film), compuse (ex. mai multe nr. de telefon a persoanei care a închiriat un film), sau derivate (ex. anul naşterii unei persoane care se obţine scăzând din anul curent vârsta persoanei respective).
Trebuie totuşi să facem diferenţa între un atribut care poate să devină coloană într-un model relaţional şi valoarea acestuia care este o valoare în coloană. Fiecarui atribut este necesar să îi atribuim o descriere, iar pentru fiecare atribut trebuie să specificam numele, tipul de date ( integer, float, char, etc) valori posibile pe care le poate lua, valori implicite, constrângeri, tipuri compuse, reguli de validare.
Diagrama E/R – Cardinalitate
Definiţie: Se numeste relaţie între entitaţile E1, E2,…Ek orice submultime a produsului cartezian al mulţimilor elementelor celor k entitaţi, adica mulţimi de elemente de forma (e1, e2,…,ek) unde “ei” este un element din “Ei”, oricare ar fi i = 1,…,k.
Prin intermediul diagramelor entitate relaţie este reprezentat grafic modelul logic al unei baze de date. Diagrama este utilizată des pentru a reprezenta grafic modelul relaţional. După cum îi spune şi numele, modelul E/R se ocupa de entitaţi, proprietaţiile sau atributele ce definesc anumite laturi ale entitaţilor şi legaturile dintre entitaţi.
Identificam entitaţile
Identificam relaţile dintre entitaţi
Stabilim cardinalităţile
Identificam atributele pentru fiecare entitate
Stabilim cheieleForme normale
Avantajele normalizarii sunt:
Mai puţin spaţiu de stocare
Actualizări mai rapide
Mai puţină neconcordanţă a datelor
Relaţii clare între date
Mai uşor de adăugat date
Structură mai flexibilă
Prima formă normală (FN1)
FN1 este adesea numita şi regulă atomică. “Atom” vine de la un cuvânt grecesc care înseamnă, în esenţă, piesa cea mai mică posibilă dintr-un obiect. Într-o bază de date, acest lucru înseamnă că fiecare coloană ar trebui să fie proiectată exclusiv să deţină numai o bucată de informaţie.
1. Înlocuim în relaţie atributele compuse cu componentele acestora.
2. Creăm o nouă relaţie pentru fiecare din grupurile repetitive.
3. În fiecare relaţie pe care am creat-o la pasul 2 introducem în schemă cheia primară a relaţiei din care am extras atributul repetitiv.
4. Stabilim cheia primară pentru fiecare relaţie pe care am creat-o la pasul 2 care este alcatuită din cheia pe care am introdus-o la pasul 3, precum şi din alte atribute a noii relaţii.Să luăm în considerare următorul exemplu şi să vedem cum aducem un tabel nenormalizat în prima formă normală (FN1).
Tabelul 3 este un tabel nenormalizat. Atributul cheie este “ID_STUD”. İdentificăm grupurile repetitive care sunt de fapt detaliile despre camerele de camin pe care le ocupa studentii, anul şi specializarea.
Putem vedea ca avem valori multiple la intersecţia anumitor rânduri cu coloane. De exemplu se poate vedea în tabelul 3 ca avem două valori ale atributului “NR_CAMIN” (98,102) care corespund studentului İonescu Gigel. Ca să putem aduce acest tabel în forma de normalizare FN1 trebuie să ne asigurăm că avem o singură valoare la intersecţia dintre fiecare rând şi fiecare coloană. Acest lucru îl facem prin eliminarea grupului repetitiv. Deci eliminam grupul repetitiv plasând într-o relaţie separată datele respective împreună cu o copie a atributului cheie initial “ID_STUD” după care identificăm o cheie primară pentru noua noastră relatie.
Relaţia Studenţi (ID_STUD, NUME_STUD)
Relaţia CameraCamin ( ID_STUD, NR_CAMIN, ADR_CAMIN, DATA_INTR, DATA_IES, CAMERA, AN,
SPECIALIZARE)
Cele două relaţii sunt acum în FN1 deoarece avem o singură valoare la intersecţia dintre fiecare rând şi fiecare coloană.
O altă modalitate de a elimina grupul repetitiv este să transformăm un rând care conţine mai multe valori ale unui atribut în mai multe randuri care să conţină o singură valoare pentru acel atribut, iar relatia care va rezulta şi pe care am denumit-o CameraCamin va fi in FN1, apoi trebuie să identificam cheile candidat ale relaţiei noastre CameraCamin care sunt de fapt chei compuse şi anume (ID_STUD, NR_CAMIN), (ID_STUD, DATA_INTR), (NR_CAMIN, DATA_INTR). Acum alegem drept cheie primară urmatoarele atribute (ID_STUD, NR_CAMIN)
CameraCamin (ID_STUD, NR_CAMIN, NUME_STUD, ADR_CAMIN, DATA_INTR, DATA_IES, CAMERA, AN, SPECIALIZARE)Această relaţie este în forma FN1 pentru că avem o singură valoare la intersecţia dintre fiecare rând şi coloană, dar totuşi relaţia noastră conţine date care se repetă de mai multe ori şi prin urmare este supusă anomaliilor de reactualizare. Ca să putem elimina această anomalie de reactualizare trebuie să transformam relaţia noastra în forma FN2.
A doua formă normala (FN2)
ID_STUD, NR_CAMIN -> DATA_INTR, DATA_IES (cheie primară)
ID_STUD -> NUME_STUD (dependenţă partială)
NR_CAMIN -> ADR_CAMIN, CAMERA, AN, SPECIALIZARE (dependenţă partială)
AN -> SPECIALIZARE (dependenţă tranzitivă)
ID_STUD , DATA_INTR -> NR_CAMIN, ADR_CAMIN, DATA_IES, CAMERA, AN, SPECIALIZARE (cheie candidat)
NR_CAMIN, DATA_INTR -> ID_STUD, NUME_STUD, DATA_IES (cheie candidat)
Atributul (NUME_STUD) este dependent parţial de cheia primară ID_STUD.
Atributele (ADR_CAMIN, CAMERA, AN, SPECIALIZARE ) sunt parţial dependente de cheia primară, ele sunt dependente numai de atributul “NR_CAMIN”.
Student (ID_STUD, NUME_STUD)
OcupareCamera (ID_STUD, NR_CAMIN, DATA_INTR, DATA_IES )
CaminStudent (NR_CAMIN, ADR_CAMIN, CAMERA, AN, SPECIALIZARE )A treia formă normală (FN3)
– dependenţele funcţionale asupra câmpurilor care nu sunt cheie sunt eliminate prin plasarea acestora într-un tabel separat. La acest nivel, toate câmpurile (coloanele) care nu sunt cheie depind de cheia primară.
– un rând este în formă normală (FN3) dacă şi numai dacă este în a doua formă normală (FN2) şi atributele care nu contribuie la o descriere a cheii primare sunt mutate într-un tabel separat.
Tabelul Student
ID_STUD -> NUME_STUD
Tabelul OcupareCamera
ID_STUD, NR_CAMIN -> DATA_INTR, DATA_IES
ID_STUD, DATA_INTR -> NR_CAMIN, DATA_IES
NR_CAMIN, DATA_INTR -> ID_STUD, DATA_IES
Tabelul CaminStudent
NR_CAMIN -> ADR_CAMIN, CAMERA, AN, SPECIALIZARE (dependenţa partială)
AN-> SPECIALIZARE (dependenţa tranzitivă)
Camin (NR_CAMIN, ADR_CAMIN, CAMERA)
Studentul (AN, SPECIALIZARE)
Student ( ID_STUD, NUME_STUD )
OcupareCamera ( ID_STUD, NR_CAMIN, DATA_INTR, DATA_IES )
Camin ( NR_CAMIN, ADR_CAMIN, CAMERA )
Reguli de integritate
Exemplu de constrângere de integritate referenţiala:
ANGAJAT( ang_id, ang_nume)
CONT( cont_id, ang_id, data_cont)
Securitatea în BD Oracle
Proiectarea securităţii
Securizarea bazei de date Oracle
1. Autentificarea
2. Controlul accesului
3. Configurarea securitaţii
4. Auditul1.Autentificarea
SQL> SELECT * FROM dba_users_with_defpwd
SQL> SELECT username, password from dba_users;
SQL> SELECT username, profile FROM dba_users;
SQL> SELECT * FROM dba_profiles;
SQL> SELECT username FROM dba_users WHERE password=’EXTERNAL’;2. Controlul accesului
SQL> SELECT * FROM dba_sys_privs;
SQL> SELECT * FROM dba_role_privs;
SQL> SELECT * FROM dba_col_privs;
SQL> SELECT * FROM dba_tab_privs;
3. Configurarea securităţii
• AUDIT_FILE_DEST
• AUDIT_SYS_OPERATIONS (Should be set to TRUE.)
• AUDIT_TRAIL (Avoid FALSE or NONE settings.)
• DIAGNOSTIC_DEST
• DISPATCHERS
• GLOBAL_NAMES (Should be set to TRUE.)
• LOG_ARCHIVE_% (Note: There are multiple parameters that exist that begin with LOG_ARCHIVE.)
• MAX_ENABLED_ROLES
• O7_DICTIONARY_ACCESSIBILITY (Should be set to FALSE.)
• OS_AUTHENT_PREFIX (Should be set to NULL, if possible. Should not be set to ops$.)
• OS_ROLES (Should be set to FALSE.)
• REMOTE_LISTENER (Should be set to NULL, unless a remote listener is needed.)
• REMOTE_LOGIN_PASSWORDFILE (Should be set to NONE, if possible.)
• REMOTE_OS_AUTHENT (Should be set to FALSE.)
• REMOTE_OS_ROLES (Should be set to FALSE.)
• RESOURCE_LIMIT (Should be set to TRUE.)
• SEC_CASE_SENSITIVE_LOGON (Should be set to TRUE.)
• SEC_MAX_FAILED_LOGIN_ATTEMPTS (Should be set to 10.)
• SEC_PROTOCOL_ERROR_FURTHER_ACTION (Avoid the setting NONE.)
• SEC_PROTOCOL_ERROR_TRACE_ACTION (Avoid the setting NONE.)
• SEC_RETURN_SERVER_RELEASE_BANNER (Should be set to FALSE.)
• SMTP_OUT_SERVER (Should list only authorized SMTP servers, if utilized.)
• SPFILE
• SQL92_SECURITY (Should be set to TRUE.)
• UTL_FILE_DIR (Should be set to a specific directory used only for necessary purposes. Values such as /tmp or * should not exist.)
• _TRACE_FILES_PUBLIC (Should be set to FALSE.)Putem aborda vulnerabilitățile de securitate pe care le-am menționat mai sus, prin aplicarea patch-urilor. Fara patch-uri corespunzătoare în vigoare, un atacator ar putea folosi vulnerabilitățile respective pentru a exploata privilegiile lor sau chiar pentru a obţine accesul.
4. Auditul
SQL> SELECT * FROM dba_stmt_audit_opts
SQL> SELECT * FROM dba_priv_audit_opts;Putem utiliza următoarea interogare pentru a determina obiectul verificat:
SQL> SELECT * FROM dba_obj_audit_opts;
Criptarea
Cifrurile bloc – de exemplu, Cipher Block Chaining (CBC)
Algoritmi cu cheie simetrică – de exemplu, AES si 3DES
Algoritmi cu cheie publică – de exemplu, rural service area (RSA)
Certificate – de exemplu, certificate X.509
Mesaje rezumate – de exemplu secure hash algorithm-1 (SHA-1) si (MD5)
Semnăturile digitale – de exemplu, semnăturile digitale RSA
Serviciile de securitate – de exemplu, SSL
Aceste elemente sunt apoi utilizate pentru următoarele scopuri (toate acestea sunt relevante în securitatea Oracle):
Confidențialitatea, cum ne putem asigura că spargătorii de coduri sau un hoţ care sustrage datele wireless nu le poate citi?
İntegritatea mesajului, cum putem şti că un mesaj nu a fost falsificat şi modificat înainte de a ajunge în baza de date?
Autentificarea – cum putem şti că un mesaj sau o acțiune vine de la o anumită persoană sau organizaţie?Criptare, algoritmi de criptare, şi cifruri
Există mulţi algoritmi de cheie simetrică (sau cifruri). Toate aceste cifruri funcționează în acelasi mod în ceea ce priveste faptul că o cheie de criptare se utilizează pentru criptarea textului clar pentru a forma un text cifrat şi apoi aceeaşi cheie este utilizată pentru a decripta textul cifrat în text clar. Există mai multe cifruri pe care le putem alege. Atunci când utilizam criptarea în cadrul Oracle vom putea alege unul din aceste cifruri:
DES-DES este un algoritm pe care nu ar trebui să-l folosim niciodată. DES a fost ales ca standardul oficial american în 1976, când computerele erau mult mai slabe în ceea ce priveste puterea de procesare. Algoritmul a fost întotdeauna controversat, are o lungime scurtă a cheii de 56 de biți, şi pentru că părțile din el sunt clasificate, s-a crezut întotdeauna că US National Security Agency (NSA) a menținut o cale de acces spre acest algoritm. Cu calculatoare de astăzi se poate sparge DES în aproximativ 24 de ore, deci e bine să nu-l utilizăm niciodată.
3DES – triplu DES este un algoritm care a fost în uz pe scară largă şi este încă – în special în sectorul financiar. Acesta este considerat a fi un algoritm puternic, dar există algoritmi mai buni in ziua de azi pe care îi putem alege. DES este prea slab din cauza cheii sale scurte de 56 biti, astfel 3DES a evoluat ca o modalitate simplă de a consolida criptarea împotriva atacului de tip „brute force”. Există două variante. In prima variantă, numită EEE, sunt făcute trei etape de criptare. În a doua variantă, numită EDE, primul pas şi al treilea sunt pasi de criptare, dar al doilea pas este un pas de decriptare (evident, nu cu aceeaşi cheie ca primul pas). 3DES fie are o lungime de 168 biți a cheii (de trei ori 56 biți utilizati în DES) sau 112 biți în cazul în care prima şi a treia cheie DES sunt aceleaşi.
AES-AES este algoritmul pe care ar trebui să-l utilizăm întotdeauna dacă avem de ales. AES (cunoscut sub numele de Rijndael ) a fost adoptat ca standard de criptare de catre guvernul Statelor Unite în 2002, după o perioadă de cinci ani cât a durat procesul de analiză, comparație şi selecție. Acesta a fost analizat pe larg şi este utilizat pe scară largă în toată lumea. Dimensiunile cheilor sunt fie 128, 192, sau 256 biti – adică AES128, AES192, AES256 deci optiuni care pot fi selectate atunci când acestea apar în Oracle.
AES, 3DES, DES toate sunt numite cifruri bloc. Se numesc cifruri bloc, deoarece acestea funcționează întotdeauna pe un bloc de date.
Criptografie cu cheie publică
Deci criptografia cu cheie publică nu are o problemă în a distribui cheia, problemă care exista în criptografia cu chei simetrice. Dacă dorim ca un client şi serverul să comunice printr-un canal nesigur tot ce trebuie să facem este să generăm două perechi de chei publică / privată – o cheie pentru client şi una pentru server.
Cheia publică nu poate fi utilizată pentru a decripta mesajul numai cheia privată poate face acest lucru şi cheia privată nu poate fi calculată din cheia publică. Serverul primeşte mesajul şi îl decriptează folosind cheia sa privată. Daca vrea să trimită un răspuns clientului, ia mesajul şi îl criptează folosind cheia publică a clientului. Acest text criptat este trimis pe canalul nesigur şi clientul îl decriptează folosind cheia sa privată. Clientul şi serverul reuşesc să comunice fără să partajeze vreun secret.
Identificarea
Metode de identificare
Identificare furnizată de utilizator
Avantajul de a folosi identificarea furnizată de utilizator este că identificatorul (de exemplu, numele de utilizator) este, în general, flexibil. Acest lucru permite administratorilor să creeze identificatori intuitivi, care sunt usor de reamintit pentru utilizatori. De exemplu, un nume de utilizator poate fi creat pe baza primei initiale a numelui persoanei şi prenumele, dar acest beneficiu este o slăbiciune. Identificatorii, care pot fi ghiciti cu usurință pot slăbi securitatea globală.
Identificare realizată prin tehnologie
Tehnologia biometrică
Mai multe companii în prezent încearcă să aducă la maturitate diverse tehnologii biometrice. Recunoaşterea facială, scanerea irisului, geometria mâinii, şi cititoare de amprente sunt printre cele mai populare. Datele biometrice sunt ideale din multe puncte de vedere. Utilizatorii nu le pot uita, şi aceste date pot fi aproape imposibil de ghicit. Furtul părții biometrice este puțin probabilă, dar există un risc asociat cu reprezentarea digitală biometrică care poate fi furată. Confuzia referitoare la cum sunt utilizate datele biometrice este frecventă. Acest lucru se datorează faptului că datele biometrice pot fi folosite atât pentru identificare cât şi în procesele de autentificare. Cu identificarea biometrică, informaţiile biometrice sunt considerate unice şi pot fi utilizate pentru a identifica cu exactitate persoana care prezintă aceste date biometrice. Acest mod de identificare diferă de identificarea furnizată de utilizator, deoarece utilizatorul nu va spune sistemului cine este, sistemul îl identifică în mod automat. De reținut un lucru, aceasta nu este autentificare, aceasta este doar identificarea, autentificarea biometrica este procesul de comparare a semnăturii, datele biometrice, cu o referință pentru a dovedi sau infirma o identitate.
Identitatea calculatorului
Firewall-urile şi diverse tehnologii securizate de rutare sunt puternic dependente de adrese MAC şi adresele IP. Servere de aplicații şi bazele de date securitate pot utiliza, de asemenea, adresele IP pentru a ajuta la furnizarea de straturi suplimentare de securitate.
Identităţi digitale
Ne putem gândi la un certificat ca la un paşaport digitalizat. Identitățile digitale sunt bine definite, atât structural cât şi semantic, şi sunt consecvente în toate aplicațiile şi platforme care acceptă standardele certificate. Acest ultim punct este esențial pentru asigurarea interoperabilității între aplicațiile şi produsele oferite de către diferiţi furnizori. Certificatele digitale sunt populare, nu numai pentru că certificatele sunt bazate pe standarde, dar şi pentru că certificatele conțin informații suplimentare care pot fi utilizate în punerea în aplicare a controalelor de securitate eficiente. Pentru identificarea utilizatorului, certificatele digitale sunt de obicei instalate în browserele Web ale utilizatorului. Ele pot fi, de asemenea, integrate în dispozitivele fizice, cum ar fi cardurile inteligente. Pentru a securiza identitatea digitală, utilizatorul poate fi obligat să furnizeze un cod PIN sau o parolă pentru deblocarea certificatului.
Falsificarea
Retragerea certificatului, care există în aproape toate aplicațiile care acceptă certificate digitale, rezolvă utilizarea ilicită a certificatelor digitale, dar numai atunci când utilizatorul sau administratorul devine constient de faptul că furtul a avut loc.
Furtul de identitate
Deoarece o mulțime de informații care pot fi utilizate pentru a crea identități false sunt deturnate din bazele de date şi aplicații prost concepute. Alegerea necorespunzătoare a unui element de identificare ar putea fi un catalizator pentru furtul de identitate. Să ne uităm la o structură de tabel posibilă ca să vedem ce riscuri există.
CREATE TABLE CLIENTI (Nume VARCHAR2(50),
Prenume VARCHAR2(50),
Nr_identif_client VARCHAR2(11),
Zi_nastere DATE);Datele din acest tabel sunt în mod clar importante (sensibile). Protejarea accesului la datele din acest tabel este o cerință de securitate evidentă. La prima vedere nu există un risc de securitate chiar atât de evident şi din acest motiv nu este neobişnuit şi anume ca un proiectant de aplicații de baze de date să utilizeze „Nr_identif_client” ca un identificator al clientului. Acest lucru este foarte riscant şi considerat a fi o decizie foarte proastă. Motivul este faptul că identificatorii clienţilor sunt uneori necesari dezvoltatorilor de aplicații pentru testare sau depanare, sau pentru verificarea accesului la baza de date de către administratorii bazei de date.
Autentificarea
Metode de autentificare
Metodele de autentificare se încadrează în următoarele trei categorii:
Autentificare puternică, de obicei, implică faptul că autentificarea nu poate fi usor de ghicit sau falsificat. Tehnologiile de autentificare au diferite abilități pentru a îndeplini sarcinile lor de autentificare. Unul dintre criterile pentru determinarea complexitătii de autentificare este de exemplu, cât de greu este să se falsifice metoda de autentificare.
Ceva ce noi suntem şi ceva ce noi avem (posedăm) sunt considerate forme mai puternice de autentificare decât ceva ce noi stim. Parolele pot fi ghicite şi prin urmare, sunt considerate metode de autentificare slabă. Falsificarea unui certificat X.509 (ceva ce avem) sau duplicarea datelor biometrice (ceva ce avem), nu este la fel de usor de falsificat ca şi ceeia ce ştim (parolele). Prin urmare, certificatele digitale, autentificări biometrice sunt considerate metode puternice de autentificare.
Nu vreau aici să sugerez că parolele nu ar trebui să fie utilizate pentru autentificare. Putem de exemplu, în calitate de administrator de baze de date, să ne asigurăm că utilizatorii bazei de date folosesc parole puternice prin implementarea unei rutine în care se utilizează parole de complexitate mare şi un profil de parolă.
Cele mai bune practici de autentificare securizată. Criptarea autentificatorilor.
Asigurarea securității pentru stocarea autentificatorilor este la fel de importantă. Adesea, autentificatorii vor fi păstraţi într-o formă criptată pentru a păstra confidențialitatea autentificatorului.
Abrevierea (prescurtatea) autentificatorilor
Criptarea parolelor, care permite o probabilă decriptarea a acestora, ar putea obţine parolele în text clar. Pentru a rezolva acestă problemă, se poate utiliza o tehnologie numită abrevierea sau prescurtarea parolelor. Prin intermediul abrevierii textul în clar se converteşte în text indescifrabil. Spre deosebire de criptare, nu există nicio modalitate de a obţine înapoi textul în clar. Deci, nu există nici o modalitate de a lua o valoare în forma abreviată şi apoi să determinăm ce a creat această valoare. Abrevierea este numită o funcție unidirecțională din cauza acestei proprietăţi. O altă proprietate importantă a abrevierii este faptul că aceeaşi intrarea va genera întotdeauna aceeaşi ieşire. Autentificarea prin parolă are loc prin abrevierea parolei şi stocarea rezultatului într-o valoare trunchiată sau abreviată. Atunci când utilizatorul introduce o parolă pentru autentificare, valoarea autentificarii furnizate de utilizator (a parolei), va fi comparată prin intermediul procesului de autentificare cu valoarea abreviată stocată. Dacă valoarea trunchiată sau abreviată se potriveste, atunci intrarea trebuie de asemenea sa se potrivească şi prin urmare parolele sunt aceleaşi. Modalitatea de abreviere poate fi folosită pentru alți autentificatori în acelaşi mod.
Baza de date
Parolele: Parolele pot fi fie autentificate de către baza de date sau de catre Oracle LDAP
Oracle suportă autentificarea sistemului de operare şi autentificări puternice, care includ certificate PKI, Kerberos, DCE şi RADIUS. Standardul RADIUS extinde capacitățile de autentificare pentru a include elementele biometrice integrate, şi carduri inteligente.Asocierea utilizatoriilor cu schemele bazelor de date
1:1 Această schemă „unu-la-unu „ se produce în principal în programe client-server. Acest lucru înseamnă că fiecare utilizator final are un cont distinct bazei de date.
N: M Acesta schemă „totii-la-mai-multi” se întâmplă ocazional în aplicații Web. Aceasta înseamnă că toți utilizatorii finali sunt mapaţi la mai multe scheme diferite. Toți utilizatorii cu aceleaşi privilegii sunt conectaţi la aceeaşi schemă.
N: 1 Acestă schemă „toti-la-unul” este o aplicație Web tipică. Aplicația conectează toți utilizatorii finali la aceeaşi schemă a bazei de date. Schema dispune de o uniune a tuturor privilegiilor pentru toţi utilizatorii conectaţi la ea.Schema sau maparile sunt enumerate în ordine de la simplu la complex pentru a construi securitatea bazei de date. Există mai mulți factori care influențează alegerea modelului. Scalabilitatea, performanţa şi administrarea uşor de folosit ne solicită de multe ori cea mai mare atenție. Securitatea însă trebuie să fie de asemenea un aspect care trebuie avut în vedere.
Privilegiile utilizatorului pentru conturile unice în baza de date.
Partajarea unui cont privilegiat printre un grup de utilizatori este o practică proastă. În multe organizații, schimbul de conturi de utilizator este interzisă de politica de securitate, dar este totuși încă folosită şi se practica de multe ori. Dacă ceva nu merge bine în acest caz, nu vom fi în măsură să spunem care utilizator a fost conectat ca utilizator al bazei de date în momentul în care s-a întâmplat ceva. Prin urmare, nu există nicio responsabilitate a utilizatorului. Schema 1:1 face securitatea bazei de date simplă pentru că identitatea utilizatorului este întotdeauna disponibilă pentru baza de date, prin urmare, utilizatorul este responsabil.
Conturi de baze de date partajate
Modelul de schemă N: 1, conectează toți utilizatorii finali la aceeaşi schemă a bazei de date. Această schemă este întotdeauna cea mai îndoielnică în ceea ce priveste securitatea. Problema cu proiectarea este faptul că e dificil pentru baza de date să separe privilegiile de securitate pentru utilizatori diferiți, deoarece toți sunt conectaţi la aceeaşi schemă. Garantarea că numai privilegiile potrivite sunt disponibile pentru utilizator este lăsată în cea mai mare parte apliacatiei. Când proiectam şi construim aplicații, trebuie să ne asiguram că este mentinut principiul cu privilegii minime. Proprietarul datelor are toate privilegiile asupra datelor. În cazul în care utilizatorii se conectează la această schemă, chiar dacă prin intermediul aplicației noastre exista un risc semnificativ de penetrare a securităţii sistemului. Aceasta se poate întampla, în cazul în care un utilizator poate sparge aplicaţia, utilizatorul va avea control complet pe partea datelor. Din acest motiv, o practică mai bună de securitate este să ne asigurăm că utilizatorii aplicației nu se pot conecta direct la contul de date.
Un aspect important al procesului de identificare este păstrarea identității. Noi trebuie să ne asigurăm că identitățile de utilizator sunt disponibile peste tot unde securitatea le solicită.
Administratorii nu ar trebui să partajeze conturi. Schemele de partajare ar trebui să fie făcute doar atunci când identitatea utilizatorilor finali poate fi păstrată şi privilegiile bazei de date sunt identice pentru toți utilizatorii conectați la aceeaşi schemă. Înțelegerea identificării şi autentificării este importantă pentru modul în care formulăm politicile noastre de securitate. Trebuie să evaluam cu atenție cerințele de securitate, valoarea şi importanţa datelor utilizate, administrarea lor, precum şi costurile asociate cu diferite tehnologii de autentificare.
Studiul de caz
Crearea bazei de date
Pentru a crea baza de date denumită “FILM” voi utiliza aplicaţia cu interfaţă grafică Oracle Database XE 11.2. Fereasta de login este aratată în figura 9 de mai jos.
Figura 9. Fereastră login aplicaţie Oracle Database XE 11.2
După ce procesul de logare în aplicaţie a avut loc, vom fi directionaţi spre o fereastră prin intermediul căreia putem crea baza noastră de date “FILM”. În această fereastră aplicaţia ne solicită să alegem crearea unei noi baze de date sau utilizarea unei baze deja existente, numele bazei de date, în cazul nostru alegem “FILM”, numele de utilizator şi parola, apoi facem clic pe Create Workspace. Fereastra prin intermediul careia creăm baza de date “FILM” este aratată în fig.10.
Figura 10. Fereastră creare bază de date „FILM”
După ce baza de date a fost creată avem acces la interfata grafica a aplicaţiei prin intermediul careia putem crea, insera, actualiza şi sterge tabelele şi informaţiile conţinute în baza noastra “FILM”. İnterfaţa grafică a aplicaţiei este aratată în figura 11.
Figura 11. Interfaţa grafică aplicaţie Oracle Application Express
Tabelele bazei de date
FILM_STOC
GEN_FILM
LIMBA_FILM
SUBTITRARE
FILM_LIPSA_STOC
COPII_FILM
FILME_INCHIRIATE
CLIENTI_INCHIRIERE_FILMStructura detaliată a tabelelor este următoarea:
CREATE TABLE “FILM_STOC”
(“ID_FILM” NUMBER NOT NULL ENABLE,
“COD_GEN_FILM” VARCHAR2(10) NOT NULL ENABLE,
“NUME_FILM” VARCHAR2(50),
“PRET_VHS” NUMBER(2,0),
“PRET_DVD” NUMBER(2,0),
“AN_APARITIE” NUMBER(4,0),
CONSTRAINT “FILM_STOC_PK” PRIMARY KEY (“ID_FILM”, “COD_GEN_FILM”) ENABLE
) ;
CREATE TABLE “GEN_FILM”
(“COD_GEN_FILM” VARCHAR2(6) NOT NULL ENABLE,
“DESCRIERE_FILM” VARCHAR2(10),
CONSTRAINT “GEN_FILM_PK” PRIMARY KEY (“COD_GEN_FILM”) ENABLE
) ;
CREATE TABLE “LIMBA_FILM”
(“ID_FILM” NUMBER NOT NULL ENABLE,
“COD_LIMBA” VARCHAR2(6) NOT NULL ENABLE,
CONSTRAINT “LIMBA_FILM_PK” PRIMARY KEY (“ID_FILM”, “COD_LIMBA”) ENABLE
) ;
CREATE TABLE “SUBTITRARE”
(“COD_LIMBA” VARCHAR2(3) NOT NULL ENABLE,
“NUME_LIMBA” VARCHAR2(10) NOT NULL ENABLE,
CONSTRAINT “SUBTITRARE_PK” PRIMARY KEY (“COD_LIMBA”, “NUME_LIMBA”) ENABLE );FILM_LIPSA_STOC – tabel ce conţine informaţii despre filmele care nu sunt disponibile, are un cod unic carte identifică filmele nedisponibile, cod care este şi cheie primară a tabelului. Comanda de creare a tabelului este următoarea:
CREATE TABLE “FILM_LIPSA_STOC”
(“ID_LIPSA_FILM” NUMBER NOT NULL ENABLE,
“FILM_DENUMIRE” VARCHAR2(50),
“FORMAT_SUPORT” VARCHAR2(3),
CONSTRAINT “FILM_LIPSA_STOC_PK” PRIMARY KEY (“ID_LIPSA_FILM”) ENABLE
) ;COPII_FILM – tabel ce conţine informaţii despre filmele care au copii, cât şi numărul acestor copii. Cheia primară este una compusă din câmpurile “id_film” şi “ nr_copii”. Comanda de creare a tabelului este următoarea:
CREATE TABLE “COPII_FILM”
(“ID_FILM” NUMBER NOT NULL ENABLE,
“NR_COPII” NUMBER NOT NULL ENABLE,
“DENUMIRE_FILM” VARCHAR2(50),
“FORMAT_MEDIA” VARCHAR2(3),
CONSTRAINT “COPII_FILM_PK” PRIMARY KEY (“ID_FILM”, “NR_COPII”) ENABLE
) ;FILME_INCHIRIATE – tabel ce conţine informaţii despre filmele închiriate clienţilor. Cheia primară este o cheie compusă din campurile “ id_film” şi “id_film_copie”. Comanda de creare a tabelului este următoarea:
CREATE TABLE “FILME_INCHIRIATE”
(“ID_FILM” NUMBER,
“ID_FILM_COPIE” NUMBER,
“DATA_INCHIRIERE” DATE,
“TITLU_FILM” VARCHAR2(50),
“PRET_INCHIRIERE” NUMBER,
“PENALIZARE_INTARZIERE_PIERDERE” NUMBER,
“DATA_RETURNARE” DATE,
CONSTRAINT “FILME_INCHIRIATE_PK” PRIMARY KEY (“ID_FILM”, “ID_FILM_COPIE”) ENABLE
) ;CLIENTI_INCHIRIERE_FILM – tabel ce conţine un cod ce identifică unic fiecare client care a închiriat filme , cât şi datele personale ale acestora. Codul unic care identifică clienţii este şi cheia primară a tabelului. Comanda de creare a tabelului este următoarea:
CREATE TABLE “CLIENTI_INCHIRIERE_FILM”
(“CLIENT_ID” NUMBER,
“NUME” VARCHAR2(20),
“PRENUME” VARCHAR2(20),
“ADRESA” VARCHAR2(50),
“ORAS” VARCHAR2(16),
“CNP” VARCHAR2(13),
“TEL” VARCHAR2(10),
CONSTRAINT “CLIENTI_INCHIRIERE__FILM_PK” PRIMARY KEY (“CLIENT_ID”) ENABLE );
 >
Inserare date în baza de date
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (’01’, ‘act’, ‘The Matrix’, ’30’, ’18’, ‘2001’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘4’, ‘com’, ‘You Have Got Mail’, ’35’, ’15’, ‘2007’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘5’, ‘dra’, ‘Red Corner’, ’34’, ’15’, ‘2004’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘6’, ‘SF’, ‘Blade Runner – Director is Cut’, ’36’, ’19’, ‘2008’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘8’, ‘cart’, ‘A Bug is Life’, ’32’, ’14’, ‘2008’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘9’, ‘com’, ‘There is Something About Mary’, ’34’, ’17’, ‘2003’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (’10’, ‘dra’, ‘Beloved’, ’30’, ’13’, ‘2002’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘2’, ‘act’, ‘Under Siege’, ’28’, ’17’, ‘2000’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘3’, ‘act’, ‘Lethal Weapon’, ’28’, ’19’, ‘2006’)
INSERT INTO “FILM”.”FILM_STOC” (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (‘7’, ‘thril’, ‘Frantic’, ’37’, ’20’, ‘2010’)Tabelul „FILM_STOC” din baza noastră de date „FILM” va avea structura în urma inserării datelor ca în figura 1.
Figura 1. Conţinut tabel Film Stoc
Pentru a introduce date în tabelul „GEN_FILM” utilizăm următorul cod SQL:
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘act’, ‘actiune’)
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘com’, ‘comedie’)
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘dra’, ‘drama’)
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘SF’, ‘stiintific’)
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘cart’, ‘desene an.’)
INSERT INTO “FILM”.”GEN_FILM” (COD_GEN_FILM, DESCRIERE_FILM) VALUES (‘thril’, ‘triller’)Tabelul „GEN_FILM” va avea structura în urma inserării datelor ca în figura 2.
Figura 2. Conţinut tabel Gen Film
Pentru a introduce date în tabelui „LIMBA_FILM” utilizăm următorul cod SQL:
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘1’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘4’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘5’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘6’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘8’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘9’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (’10’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘2’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘3’, ‘en’)
INSERT INTO “FILM”.”LIMBA_FILM” (ID_FILM, COD_LIMBA) VALUES (‘7’, ‘en’)Tabelul “LIMBA_FILM” va avea structura în urma inserării datelor ca în figura 3.
Figura 3. Conţinut tabel Limba Film
Tabelui „SUBTITRARE” arată corespondenţa dintre limba originală a filmului şi limba în care este subtitrat. Pentru a introduce în tabel datele care arată această corespondenţă utilizăm următorul cod SQL:
INSERT INTO “FILM”.”SUBTITRARE” (COD_LIMBA, NUME_LIMBA) VALUES (‘en’, ‘romana’)Tabelul “SUBTITRARE” va avea structura în urma inserării datelor ca în figura 4.
Figura 4. Conţinut tabel Subtitrare
Pentru a introduce date în tabelul „FILM_LIPSA_STOC” utilizăm următorul cod SQL:
INSERT INTO “FILM”.”FILM_LIPSA_STOC” (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (’23’, ‘Courage Under Fire’, ‘DVD’)
INSERT INTO “FILM”.”FILM_LIPSA_STOC” (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (’41’, ‘Die Hard a Vengeance’, ‘VHS’)
INSERT INTO “FILM”.”FILM_LIPSA_STOC” (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (’63’, ‘The Replacement Killers’, ‘DVD’)Tabelul “FILM_LIPSA_STOC” va avea structura în urma inserării datelor ca în figura 5.
Figura 5. Conţinut tabel Film Lipsa Stoc
Pentru a introduce date în tabelui „COPII_FILM” utilizăm urmatorul cod SQL:
INSERT INTO “FILM”.”COPII_FILM” (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (‘3’, ‘4’, ‘Lethal Weapon’, ‘DVD’)
INSERT INTO “FILM”.”COPII_FILM” (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (‘1’, ‘6’, ‘The Matrix’, ‘DVD’)
INSERT INTO “FILM”.”COPII_FILM” (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (‘7’, ‘3’, ‘Frantic’, ‘DVD’)Tabelul “COPII_FILM” va avea structura în urma inserării datelor ca în figura 6 şi va conţine filmele care deţin copii.
Figura 6. Conţinut tabel Copii Film
Pentru a introduce datele corespunzătoare filmelor pe care le-am închiriat în tabelul „FILME_INCHIRIATE”, utilizăm următorul cod SQL:
INSERT INTO “FILM”.”FILME_INCHIRIATE” (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (‘3’, ‘2’, TO_DATE(’04-APR-06′, ‘DD-MON-RR’), ‘Lethal Weapon’, ’19’)
INSERT INTO “FILM”.”FILME_INCHIRIATE” (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (‘1’, ‘3’, TO_DATE(’21-JUN-01′, ‘DD-MON-RR’), ‘The Matrix’, ’18’)
INSERT INTO “FILM”.”FILME_INCHIRIATE” (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (‘7’, ‘3’, TO_DATE(’11-AUG-10′, ‘DD-MON-RR’), ‘Frantic’, ’20’)Tabelul “FILME_INCHIRIATE” va avea structura în urma inserării datelor ca în figura 7.
Figura 7. Conţinut tabel Filme Inchiriate
Pentru a introduce datele clienţilor care au închiriat filme de la magazinul nostru, în tabelul „CLIENTI_INCHIRIERE_FILM”, utilizăm următorul cod SQL:
INSERT INTO “FILM”.”CLIENTI_INCHIRIERE_FILM” (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (‘2632’, ‘Popescu’, ‘Valentin’, ‘Republicii 22’, ‘Bucuresti’, ‘1426784951209’, ‘0214716683’)
INSERT INTO “FILM”.”CLIENTI_INCHIRIERE_FILM” (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (‘1874’, ‘Ana’, ‘Maria’, ‘Take Ionescu 12’, ‘Timisoara’, ‘2705448793256’, ‘0256447391’)
INSERT INTO “FILM”.”CLIENTI_INCHIRIERE_FILM” (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (‘4133’, ‘Alexandru’, ‘Nicolae’, ‘Soroca 36’, ‘Brasov’, ‘1203698754128’, ‘0729477596’)Tabelul “CLIENTI _INCHIRIERE_FILM” va avea structura în urma inserării datelor ca în figura 8 şi va conţine datele personale ale clienţilor care au inchiriat filme.
Figura 8. Conţinut tabel Clienti Inchiriere Film
Diagrama entitate – relaţie
Diagrama E/R pentru modelul de date prezentat se poate vedea în figura 12.
Fig.12. Diagrama E/R a studiului de caz
Pentru modelul de date pe care îl descriu entităţile sunt următoarele:
FILM_STOC, GEN_FILM, LIMBA_FILM, SUBTITRARE, FILM_LIPSA_STOC, COPII_FILM, FILME_INCHIRIATE, CLIENTI_INCHIRIERE_FILMAm să prezint în continuare entitaţile modelului de date al studiului de caz şi voi face o descriere a fiecareia. Voi preciza cheia primară pentru fiecare entitate.
FILM_STOC = conţine informaţii despre numele filmelor pe care le deţine în stoc societatea care are ca activitate închirierea de filme către clienţi. De asemenea tot aici găsim şi preţul de închiriere pentru aceste filme atât pe supart VHS cât şi pe DVD, anul apariţiei filmului şi un cod asociat filmului respectiv. Cheia primară a entitaţii este “id_film”.
GEN_FILM = oferă informaţii despre genul filmelor deţinute pe stoc. Cheia primară a entitaţii este “cod_gen_film”.
LIMBA_FILM = furnizează informaţii despre limba originală a filmelor existente pe stoc. Cheia primară a entitaţii este o cheia compusă din “id_film” şi “cod_limba”.
SUBTITRARE = ne spune limba în care sunt titrate filmele care au un anumit cod pentru limbă în entitatea LIMBA_FILM. Adica ce subtitrare îi corespunde unui anumit film care are un cod pentru limbă în entitatea LIMBA_FILM. Cheia primară a entitaţii este o cheie compusă din “ cod_limba” şi “nume_limba”
FILM_LIPSA_STOC = ne oferă informaţii despre filmele care nu sunt disponibile în stoc şi formatul acestora VHS sau DVD. Cheia primară a entitaţii este “id_lipsa_film”.
COPII_FILM = oferă informaţii despre nr. de copii existente ale filmelor din stoc, denumirea acestor filme căt şi suportul pe care se găsesc aceste filme VHS sau DVD. Cheia primară a entitaţii este o cheia compusă din “ id_film” şi “ nr_copii”.
FILME_INCHIRIATE = furnizează informaţii despre filmele închiriate clienţilor, titlul filmelor închiriate , pretul de închiriere, data închirierii, data cand filmele trebuie returnate cât şi penalizarea pentru întarzierea returnării sau pierderii produsului. Cheia primară a entitaţii este o cheie compusă din “id_film” şi “id_film_copie”.
CLIENTI_INCHIRIERE_FILM = ne oferă informaţii despre datele personale ale clienţilor care au inchiriat filme, cât şi numarul de telefon al acestora. Cheia primară a entitaţii este “client_id”.
Am să prezint relaţiile modelului de date al studiului de caz şi voi face o descriere a acestora. De asemenea pentru fiecare relaţie voi prezenta cardinalitatea minimă şi maximă.
FILM_STOC are GEN_FILM = relaţia dintre FILM_STOC şi GEN_FILM reflectă legătura dintre acestea ( un film existent pe stoc are un anumit gen, de ex. actiune, comedie, etc). Ea are cardinalitatea minima 1:1 (un film existent în stoc are un anumit gen şi un anumit gen de film poate să existe în filmele de pe stoc) şi cardinalitatea maximă 1:n ( un film existent în stoc are un anumit gen, dar mai multe genuri de filme pot exista pe stoc).
FILM_STOC închiriază FILME_INCHIRIATE = relaţia de tip many-to-many dintre entitatea FILM_STOC şi FILME_INCHIRIATE reflectă legatura dintre acestea ( unul sau mai multe filme de pe stoc sunt oferite spre a fi inchiriate ). Această relaţie are cardinalitatea 1:1 ( un anumit film existent în stoc este oferit spre a fi inchiriat şi de asemenea un film inchiriat este unul din filmele existente pe stoc) şi cardinalitatea maximă m:n ( mai multe filme existente pe stoc sunt oferite spre inchiriere şi mai multe filme închiriate sunt dintre filmele existente pe stoc).
FILM_STOC are COPII_FILM = relaţie de tip many-to-many dintre entitaţile FILM_STOC şi COPII_FILM arată legatura dintre acestea (mai multe filme existente pe stoc au mai multe copii ). Această relatie are cardinalitatea maximă m:n şi cardinalitatea minima 1:1.
FILM_STOC are LIMBA_FILM = relaţia dintre entitaţile FILM_STOC şi LIMBA_FILM reflectă legatura dintre aceste entitaţi ( unul sau mai multe filme de pe stoc au o limbă originală în care au fost regizate ). Aceasta relaţie are cardinalitatea minimă 1:1 ( un film de pe stoc are o limbă în care a fost regizat ) şi cardinalitatea maximă 1:n ( mai multe filme din stoc au o singură limbă în care au fost regizate ).
LIMBA_FILM are SUBTITRARE = relaţia dintre entităţile LIMBA_FILM şi SUBTITRARE ( limba originală în care a fost regizat un anumit film are o anumită subtitrare ). Relaţia are cardinalitatea minimă 1:1 (un film are o subtitrare şi o subtitrare corespunde unui film) şi cadinalitatea maximă 1:n (o subtitrare poate exista la mai multe filme).
CLIENTI_INCHIRIERE_FILM închiriază FILME_INCHIRIATE = relaţie de tip many-to-many dintre entitaţile CLIENTI_INCHIRIERE_FILM şi FILME_INCHIRIATE reflectă legătura dintre acestea ( filmele care sunt închiriate clientilor ). Această relaţie are cardinalitatea maximă m:n (mai multe filme sunt închiriate la mai mulţi clienţi şi mai multi clienti au inchiriat mai multe filme) şi cardinalitatea minimă 1:1 (un film este închiriat la un client şi un client a închiriat un singur film).
COPII_FILM închiriază FILME_INCHIRIATE = relaţie de tip many-to-many dintre entitaţiile COPII_FILM şi FILME_INCHIRIATE reflectă legătura dintre aceste entitaţi (copii a filmelor sunt închiriate). Această relaţie are cardinalitatea maximă m:n (mai multe copii ale filmelor sunt închiriate şi mai multe filme închiriate sunt dintre filmele care au copii).
FILM_LIPSA_STOC are GEN_FILM = relaţia dintre entitaţile FILM_LIPSA_STOC şi GEN_FILM reflectă legătura dintre acestea ( filmele care nu sunt disponibile pe stoc au anumite genuri ). Aceasta relaţie are cardinalitatea 1:1 ( un film inexistent pe stoc are un gen şi un anumit gen de film nu există printre filmele care nu sunt momentan disponibile pe stoc ), şi cardinalitatea maximă n:m.
În continuare am să descriu trei entitaţi împreună cu atributele acestora, tipurile de date, lungimea lor maximă şi o descriere a acestora pentru exemplificare.
id_film = variabilă de tip number, de lungime maximă 2, care reprezintă id-ul unui film existent pe stoc
code_gen_film = variabilă de tip varchar 2, de lungime maximă 8 biti, care reprezintă codul genului de film existent pe stoc
nume_film = variabilă de tip varchar 2, de lungime maximă 50 biti, care reprezintă numele filmului
pret_VHS = variabilă de tip float, de lungime maximă 2, care reprezintă preţul de închiriere a unui film pe suport VHS
pret_DVD = variabilă de tip float, de lungime maximă 2, care reprezintă preţul de închiriere a unui film pe suport DVD
an _aparitie = variabilă de tip number, de lungime maximă 4, care reprezintă anul de aparitie al filmului
Id_film = variabilă de tip number, de lungime maximă 2, care reprezintă id-ul filmului închiriat
Id_film_copie = variabilă de tip number, de lungime maximă 2, care reprezintă id-ul filmului copie şi împreuna cu id_film formerază cheia primară a entitaţii FILME_INCHIRIATE
Data_inchiriere = variabilă de tip date, care reprezintă data la care a fost închiriat un anumit film
Titlu_film = variabilă de tip varchar 2 , de lungime 50 biti, care reprezintă titlul filmului închiriat
Pret_inchiriere = variabilă de tip float, de lungime maximă 2, care reprezintă preţul închirierii filmului
Data_returnare = variabilă de tip date, care reprezintă data la care a fost returnat filmul închiriat
Client_id = variabilă de tip number, de lungime maximă 2, care reprezintă id-ul clientului care a închiriat un anumit film
Nume = variabilă de tip varchar 2, de lungime maximă 16 biti, care reprezintă numele clientului care a închiriat filme
Prenume = variabilă de tip varchar 2, de lungime maximă 16 biti, care reprezintă prenumele clientului care a închiriat filme
Adresa = variabilă de tip varchar 2 , de lungime 32 biti, care reprezintă adresa clientului care a închiriat filme
Oras = variabilă de tip varchar 2, de lungime maximă 16 biti, care reprezintă oraşul din care este clientul care a închiriat filme
Cnp = variabilă de tip varchar 2, de lungime maximă 13 biti, care reprezintă codul numeric personal al clientului
Tel = variabilă de tip varchar 2, de lungime maximă 16 biti, care reprezintă numarul de telefon al clientului
Voi descrie în continuare ca exemplu atributele relaţiei “FILM_STOC are GEN_FILM”, tipul de date, lungimea în biti a fiecarui atribut al relaţiei şi ce reprezintă fiecare.
Relaţia FILM_STOC are GEN_FILM are ca atribute :
cod_gen_film = variabilă de tip varchar 2, de lungime maximă 8 biti, care reprezintă codul genului de film. Atributul trebuie să corespundă la o valoare a cheii primare din tabelul (entitatea) GEN_FILM.
id_film = variabilă de tip number, de lungime maximă 2, care reprezintă id-ul unui film existent pe stoc. Atributul trebuie să corespundă la o valoare a cheii primare din tabelul (entitatea) FILM_STOC.
descriere_film = variabilă de tip varchar 2, de lungime maximă 50 biti, care oferă o scurtă descriere despre un anumit film. Atributul trebuie să corespundă la o valoare corespunzătoare a tipului de date din tabelul (entitatea) GEN_FILM.
nume_film = variabilă de tip varchar 2, de lungime maximă 50 biti, care reprezintă numele filmului. Atributul trebuie să corespundă la o valoare corespunzatoare a tipului de date din tabelul (entitatea) FILM_STOC.
pret_VHS = variabilă de tip float, de lungime maximă 2, care reprezintă pretul de închiriere a unui film pe suport VHS. Atributul trebuie să corespundă la o valoare corespunzătoare a tipului de date din tabelul (entitatea) FILM_STOC.
pret_DVD = variabilă de tip float, de lungime maximă 2, care reprezintă preţul de închiriere a unui film pe suport DVD. Atributul trebuie să corespundă la o valoare corespunzătoare a tipului de date din tabelul (entitatea) FILM_STOC.
an _aparitie = variabilă de tip number, de lungime maximă 4, care reprezintă anul de apariţie al filmului. Atributul trebuie să corespundă la o valoare corespunzatoare a tipului de date din tabelul (entitatea) FILM_STOC.
Diagrama conceptuală – cheia primară, cheia străină
Primul pas în proiectarea unei baze de date relaţionale este acela de a analiza situaţia reală pe care trebuie să o reprezentăm sau să o modelăm prin intermediul bazei noastre de date.
Cerinţele utilizatorilor în ce priveşte datele pe care trebuie să le stocăm şi administrăm
Cerinţele utilizatorilor în ce priveşte operaţiile care trebuie să fie efectuate cu aceste dateÎn cazul modelului relaţional din lucrarea mea, pentru a obţine schema conceptuală voi pleca de la o descriere mai detaliată a entitaţilor şi atributelor, a relaţiilor dintre aceste entitaţi şi condiţiile pe care acestea trebuie să le îndeplinească, deci voi pleca de la diagrama E/R a studiului de caz. Scopul este de a reprezenta entităţiile şi legăturile dintre entităţi prin intermediul unor relaţii sau tabele.
În diagrama conceptuală voi reprezenta prin simbolul “x” locul unde este plasată cheia externă, iar prin simbolul “x” voi arăta că respectiva cheie externă este conţinută în cheia primară.
Schema conceptuală a bazei de date corespunde unei descrieri de forma:
nume_entitate = {listă de atribute}
Cheile primare sunt atributele subliniate. Entitaţile şi atributele sunt apelate prin substantive, iar relaţiile dintre entitaţi sunt denumite prin verbe. În unele cazuri ordinea entitaţilor din relaţie este importanta şi atunci avem doua relaţii care se citesc de la stanga la dreapta şi invers de la dreapta la stanga, dar şi situaţii în care ordine nu conteaza. Numele date entitaţilor şi relaţiilor trebuie să fie unice, iar numele atributelor trebuie să fie unice numai la nivelul aceleiaşi entitaţi. Este de preferat pentru simplitatea referinţelor, ca numele atributelor care sunt chei primare să fie unice la nivelul bazei de date.
Entitaţile independente CLIENTI_INCHIRIERE_FILM, FILM_LIPSA_STOC devin tabele independente. Cheile primare ale celor doua entitaţi independente sunt:
CLIENTI_INCHIRIERE_FILM = {CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL};
FILM_LIPSA_STOC = {ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT};
Entitaţiile dependente devin tabele dependente. Cheile primare ale celor trei entitaţi dependente sunt urmatoarele:
COPI_FILM = { ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA };
FILME_INCHIRIATE = {ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE, PENALIZARE_INTARZIERE_PIERDERE, DATA_RETURNARE };
GEN_FILM = {COD_GEN_FILM, DESCRIERE_FILM };
Subentitatea SUBTITRARE devine subtabel , avand cheia primară compusă din atributele COD_LIMBA şi NUME_LIMBARelaţiile de tip one-to-one şi one-to-many devin chei externe.
Relaţia LIMBA_FILM are SUBTITRARE devine cheie externă în tabelul LIMBA_FILM, iar cheia externă “cod_limba” din tabelul LIMBA_FILM este conţinută în cheia primară a tabelului LIMBA_FILM.
Relaţia FILM_STOC închiriaza FILME_INCHIRIATE devine cheie externă în tabelul FILME _INCHIRIATE
Relaţiile de tip many-to-many devin tabele asociative, având două chei externe “id_film” şi “cod_gen_film” pentru cele patru tabele asociate.
Relaţia CLIENTI_INCHIRIERE_FILM închiriază FILME _INCHIRIATE devine tabel asociativ (INCHIRIAZA).
Relaţia FILME_INCHIRIATE închiriază COPII_FILM devine tabel asociativ (INCHIRIAZA).
Relaţia FILM_LIPSA_STOC are GEN_FILM devine tabel asociativ (ARE).
Relaţia FILM_STOC are GEN_FILM devine tabel asociativ (ARE).
Relaţiile de tipul trei (cele care leagă cel putin trei entitaţi) devin tabele asociative, având chei externe pentru fiecare dintre tabelele asociate.
Relaţia ‘are” care leagă entităţile FILM_STOC, GEN_FILM, LIMBA_FILM, COPII_FILM devine tabel asociativ (ARE). Tabelul asociativ are chei externe atributele: ID_FILM şi COD_GEN_FILM , acestea sunt conţinute în cheile primare.
Schemele relaţionale corespunzătoare diagramei conceptuale sunt următoarele:
FILM_STOC(ID_FILM#, COD_GEN_FILM#, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE )
GEN_FILM(COD_GEN_FILM#, DESCRIERE_FILM )
LIMBA_FILM(ID_FILM#, COD_LIMBA# )
SUBTITRARE ( COD_LIMBA#, NUME_LIMBA# )
COPII_FILM ( ID_FILM#, NR_COPII#, DENUMIRE_FILM, FORMAT_MEDIA )
FILM_LIPSA_STOC ( ID_LIPSA_FILM#, FILM_DENUMIRE, FORMAT_MEDIA )
FILME_INCHIRIATE ( ID_FILM#, ID_FILM_COPIE#, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE, PENALIZARE_INTARZIERE_PIERDERE, DATA_RETURNARE )
CLIENTI_INCHIRIERE_FILM ( CLIENT_ID#, NUME, PRENUME, ADRESA, ORAS, CNP, TEL )Diagrama conceptuală a schemelor relaţionale mai sus menţionate se poate vedea în figura 13.
Fig.13. Diagrama conceptuală a studiului de caz
Interogări – exemple de interogări
Pentru a selecta toate filmele pe care le deţinem în baza de date folosim instrucţiunea SELECT în felul urmator:
SELECT * FROM FILM_STOC;Rezultatul aceste interogări se poate vedea în tabelul 14.
Fig.14. Conţinut tabel Film Stoc
Pentru a selecta doar un anumit film din baza noastră de date de ex. filmul “Under Siege” folosim instructiunea SELECT împreuna cu clauza WHERE în felul urmator:
SELECT * FROM FILM_STOC
WHERE NUME_FILM = ‘Under Siege’;Rezultatul acestei interogari va fi cel din figura 15.
Fig.15. Rezultat interogare folosind clauza WHERE
Pentru a vedea căte copii ale filmului “Lethal Weapon” avem utilizăm urmatoarea interogare:
SELECT * FROM COPII_FILM
WHERE DENUMIRE_FILM =’Lethal Weapon’
AND ID_FILM = ‘3’;Rezultatul acestei interogari va fi cel din fig. 16.
Fig.16. Rezultat interogare după nr. copii film Lethal Weapon
Pentru a interoga baza noastră de date şi a afla dacă filmul ‘Die Hard a Vengeance’ este unul din filmele care nu le detinem pe stoc la un moment dat, iar formatul suportului este VHS putem utiliza următoarea interogare:
SELECT * FROM FILM_LIPSA_STOC
WHERE FILM_DENUMIRE =’Die Hard a Vengeance’
AND FORMAT_SUPORT = ‘VHS’;Rezultatul interogarii este cel din fig. 17.
Fig.17. Rezultat interogare după film lipsa stoc şi suport VHS
Dacă dorim să interogam baza noastră de date pentru a afla informatii care sunt dispuse în două sau mai multe tabele putem utiliza instrucţiunea SELECT în combinaţie cu clauzele WHERE şi JOIN. De exemplu dacă dorim să aflăm denumirea filmelor care au copii, formatul media al acestor filme şi data la care aceste copii ale filmelor au fost închiriate clienţilor utilizăm clauzele WHERE şi JOIN în interogare în felul următor:
SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM C, FILME_INCHIRIATE F WHERE C.ID_FILM = F.ID_FILM;
sau cu clauza join:SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM C JOIN FILME_INCHIRIATE F ON (C.ID_FILM=F.ID_FILM);
sau în felul urmator:SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM JOIN FILME_INCHIRIATE USING (ID_FILM);
Rezultatul acestor trei metode de interogări va fi cel din fig.18
Fig.18. Rezultatul interogărilor întoarce date din două tabele
Selecţia de mai jos cu clauza JOIN extrage date din tabelele FILM_STOC şi LIMBA_FILM şi ne oferă informaţii despre numele filmului, anul apariţiei şi limba în care a fost regizat filmul.
SELECT NUME_FILM, AN_APARITIE, COD_LIMBA
FROM FILM_STOC F JOIN LIMBA_FILM L ON (F.ID_FILM = L.ID_FILM);Rezultatul interogarii este arătat în figura 19.
Fig.19. Rezultatul interogării întoarce date din tabelul FILM_STOC şi LIMBA_FILM
Daca dorim să aflăm o scurtă descriere a fiecarui film din figura 19 putem utiliza următoarea interogare folosind clauza JOIN în felul urmator:
SELECT NUME_FILM, DESCRIERE_FILM
FROM FILM_STOC F JOIN GEN_FILM G ON (F.COD_GEN_FILM = G.COD_GEN_FILM);sau în felul urmator:
SELECT NUME_FILM, DESCRIERE_FILM
FROM FILM_STOC JOIN GEN_FILM USING (COD_GEN_FILM);Rezultatul celor două modalităţi de interogare va fi cel din figura 20.
Fig. 20. Rezultatul celor două interogării oferă o scurtă descriere a fiecărui film din fig 19
Daca dorim să ţinem evidenţa tuturor filmelor de acţiune care au fost închiriate într-o perioadă de timp, numele şi prenumele celor care au închiriat aceste filme, cât şi data închirierii şi preţul avem nevoie să consultăm informaţii care se află în trei tabele şi anume FILM_STOC, CLIENTI_INCHIRIERE_FILM, FILME_INCHIRIATE. Pentru a obţine aceste informaţii putem crea o vizualizare şi apoi să consultăm acea vizualizare ca să obţinem informaţiile care ne interesează.
Vizualizarea pe care am creat-o ca exemplu se numeste FILME_ACT_INCHIRIATE şi are urmatorul cod SQL:
CREATE VIEW FILME_ACT_INCHIRIATE AS
SELECT COD_GEN_FILM, NUME_FILM, NUME, PRENUME, DATA_INCHIRIERE, PRET_INCHIRIERE
FROM FILM_STOC, CLIENTI_INCHIRIERE_FILM, FILME_INCHIRIATE
WHERE COD_GEN_FILM = ‘act’ ;Acum putem consulta vizualizarea creată şi deci obţine informaţiile care ne interesează. Pentru a face acest lucru folosim urmatoarea interogare:
SELECT * FROM FILME_ACT_INCHIRIATE;Rezultatul acestei selecţii va afişa vizualizarea creată anterior, vezi fig.21
Fig.21. Vizualizare FILME_ACT_INCHIRIATE
Putem căuta în vizualizarea noastră doar informaţiile care ne interesează, de exemplu dorim să ştim ce filme a închiriat un anumit client şi anume Popescu Valentin. Pentru a obţine doar acele linii din vizualizarea noastră care corespund clientului Popescu Valentin, rafinăm căutatea noastră adăugând clauza WHERE în interogare ca în exemplul de mai jos:
SELECT * FROM FILME_ACT_INCHIRIATE
WHERE NUME = ‘Popescu’ AND PRENUME = ‘Valentin’;Acum rezultatul selecţiei din vizualizarea noastră va întoarce doar înregistrarile care corespund clientului Popescu Valentin. În figura 22 putem vedea doar înregistrarile referitoare la clientul Popescu Valentin.
Fig.22. Vizualizare FILME_ACT_INCHIRIATE care corespunde clientului Popescu Valentin
No matter if some one searches for his necessary thing, thus
he/she wants to be available that in detail, thus that thing is maintained
over here.
Hmm is anyone else experiencing problems with the images on this blog loading?
I’m trying to find out if its a problem on my end or
if it’s the blog. Any suggestions would be greatly appreciated.
excellent points altogether, you simply received a new reader.
What might you recommend in regards to your post
that you just made some days ago? Any sure?
I know this if off topic but I’m looking into starting my own blog and was curious what all is required to get setup?
I’m assuming having a blog like yours would cost a pretty penny?
I’m not very web savvy so I’m not 100% sure.
Any recommendations or advice would be greatly appreciated.
Kudos
my site – Shanice
I have read a few just right stuff here. Definitely value bookmarking for revisiting.
I wonder how a lot attempt you put to create any such
fantastic informative website.
Excellent weblog right here! Also your website a lot up fast!
What web host are you using? Can I get your affiliate link on your host?
I desire my site loaded up as fast as yours lol http://xiamenyoga.com/comment/html/?379028.html
Thanks for finally writing about > Crearea unei baze de date Oracle – eugo.ro < Loved it!
Does your blog have a contact page? I’m
having trouble locating it but, I’d like to send you an e-mail.
I’ve got some ideas for your blog you might be interested in hearing.
Either way, great site and I look forward to seeing it expand over time.
Generally I don’t learn article on blogs, however I would
like to say that this write-up very pressured me to take a look at and do so!
Your writing taste has been surprised me. Thanks, quite nice article.
Great goods from you, man. I’ve understand your stuff previous to and you’re just extremely
great. I really like what you’ve acquired here, certainly like what you are saying and the way
in which you say it. You make it enjoyable and you still take care of to keep it wise.
I can not wait to read far more from you. This is really a terrific site.
It’s great that you are getting ideas from this piece of writing as well as from our discussion made at
this place.
What’s Happening i’m new to this, I stumbled upon this I’ve discovered It positively helpful and it has helped
me out loads. I’m hoping to give a contribution &
aid different customers like its helped me. Great job. http://suprememasterchinghai.net/bbs/board.php?bo_table=free&wr_id=4528845
I’ve been surfing online more than 2 hours today, yet I never found any interesting
article like yours. It’s pretty worth enough for me. In my view,
if all webmasters and bloggers made good content as you did, the net will be much more useful than ever before. http://Vivamarketing.Co.kr/bbs/board.php?bo_table=board0203&wr_id=166941
When some one searches for his required thing,
so he/she needs to be available that in detail, therefore that thing is
maintained over here. https://Theterritorian.Com.au/index.php?page=user&action=pub_profile&id=878154
Hey very interesting blog! https://Commealatele.com/question/production-de-videos-promotionnelles-creer-un-impact-visuel-et-narratif-2/
I was wondering if you ever thought of changing the layout of your website?
Its very well written; I love what youve got to say.
But maybe you could a little more in the way of content so people
could connect with it better. Youve got an awful lot of text for only having one or two images.
Maybe you could space it out better? https://namosusan.com/bbs/board.php?bo_table=free&wr_id=371387
Hi there mates, pleasant piece of writing and nice arguments commented here, I am in fact enjoying by these. https://Vknigah.com/user/ChandraTubb056/
I’ve been exploring for a bit for any high-quality articles or blog posts in this sort
of space . Exploring in Yahoo I ultimately stumbled upon this web site.
Reading this info So i am satisfied to express that I’ve a very good uncanny feeling I
found out just what I needed. I such a lot for sure will make certain to do not forget this website and give it a glance regularly. https://Cl-system.jp/question/national-cheerleading-championship-a-celebration-of-spirit-and-skill-74/
Hey very interesting blog!
在这里下载Telegram官网最新版,适用于所有主流操作系统。本站为你提供详细的纸飞机使用指南,包括如何下载、安装以及设置中文界面,帮助你轻松使用这一全球领先的通讯 https://www.telegrambbs.com
有道词典是由网易有道出品的全球首款基于搜索引擎技术的全能免费语言翻译软件。简介. 支持中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、藏语、西语等109种语言翻译。拍照翻译、语音翻译、对话翻译、在线翻译、离线翻译更顺畅。更多的翻译 https://www.fanyim.com
Very descriptive blog, I liked that a lot. Will there be a part
2?
https://www.telqq.com Telegram群组,Telegram群组导航。收录Telegram上的优质频道和群组,打造一个高质量Telegram导航。TGNAV收录整理了Telegram上的许多优质频道、群组、机器人,帮助用户发现更多优质的群组。
https://www.tellern.com Telegram应用是开源的,Telegram下载的程序支持可重现的构建。Telegram同时适用于以下环境:Android安卓端,iPhone 和 iPad及MacOS的Apple端,Windows/Mac/Linux桌面版
I got this site from my pal who shared with me concerning this site and now this time I am browsing this web page
and reading very informative posts at this time.
Have you ever thought about creating an e-book or guest
authoring on other websites? I have a blog centered
on the same information you discuss and would really like to have
you share some stories/information. I know my viewers would
enjoy your work. If you are even remotely interested, feel free
to send me an e mail.
Hi, i believe that i noticed you visited my web site thus i came to return the choose?.I’m attempting
to to find issues to improve my site!I assume its adequate to make use
of some of your ideas!!
Wonderful blog! I found it while searching on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?
I’ve been trying for a while but I never seem to get there!
Cheers
I just like the valuable info you provide on your articles.
I’ll bookmark your weblog and check once more right here regularly.
I am moderately certain I’ll be told a lot of new stuff right here!
Best of luck for the following!
Hey outstanding website! Does running a blog like this require a great deal of work?
I’ve virtually no understanding of programming however I was hoping to start my own blog soon. Anyways, if you have any ideas or techniques for new
blog owners please share. I understand this is off topic
but I simply wanted to ask. Cheers!
Polygon Bridge The Top Crypto Platform in 2025
I truly love your blog.. Pleasant colors & theme. Did you
make this site yourself? Please reply back as
I’m wanting to create my own blog and want to learn where you
got this from or exactly what the theme is named.
Many thanks! please visit calototo : https://calobatam.com/
Hi, just wanted to mention, I liked this blog post.
It was practical. Keep on posting!
Appreciate this post. Will try it out.
This article provides clear idea in favor of the new visitors of blogging, that really how to do blogging.
Whats up this is kinda of off topic but I was wanting to know
if blogs use WYSIWYG editors or if you have to manually
code with HTML. I’m starting a blog soon but have no
coding know-how so I wanted to get guidance from someone
with experience. Any help would be greatly appreciated!
Your means of telling everything in this piece of writing is really fastidious, all be able to easily
understand it, Thanks a lot.
Hello there! I could have sworn I’ve visited this blog before but after
going through many of the articles I realized it’s new to
me. Anyways, I’m certainly delighted I stumbled upon it and I’ll be bookmarking
it and checking back often!
Very good blog post. I absolutely love this website.
Keep writing!
Also visit my web page more
I’ve read a few good stuff here. Certainly worth bookmarking
for revisiting. I wonder how a lot attempt you put to create this sort
of great informative website.
Thank you a lot for sharing this with all people you actually understand what you’re
talking approximately! Bookmarked. Kindly additionally visit my website =).
We can have a hyperlink alternate arrangement among us
Good way of describing, and fastidious piece of writing to take facts about
my presentation subject, which i am going to convey in school.
I was more than happy to uncover this web site. I want to to thank
you for ones time for this particularly fantastic read!!
I definitely savored every bit of it and I have you book-marked to see new information on your web
site. http://forum.altaycoins.com/profile.php?id=955078
Hey would you mind letting me know which web host you’re working with?
I’ve loaded your blog in 3 completely different web browsers and I
must say this blog loads a lot faster then most. Can you recommend a
good hosting provider at a fair price? Thanks, I appreciate it!
all tһe time i ᥙsed tߋ reaԁ smаller articles thɑt alsⲟ сlear theiг motive, and tһat is aoso
happening wіtһ thiѕ article wһich I am reading noѡ.
Here is my site – Cement –Wysokiej jakośϲi cement ⅾo każdej budowy.
(http://www.dotank.kr)
مرحبًا بكم في كازينو YYY، حيث
تلتقي التقاليد بالفخامة في عالم الألعاب
عبر الإنترنت. نحن لسنا مجرد كازينو؛ نحن احتفال بالثقافة، مصمم خصيصًا للاعبين العرب.
من تصميم واجهة المستخدم الفخمة إلى اللمسة الشخصية في دعم العملاء، كل
تفصيل في كازينو YYY مصمم لجعلك
تشعر بالتقدير والألفة.
في كازينو YYY، استمتع بمجموعة متنوعة من الألعاب التي تمزج
التراث الغني بالتكنولوجيا الحديثة.
سواء كنت تدور البكرات في أحدث الفتحات لدينا
أو تشارك في لعبة بكارات الخالدة، كل
لحظة هنا مصممة لتكون لا تنسى.
استمتع بمكافآت حصرية تعزز
تجربتك في اللعب، وتجربة خدمة عملاء تضعك في المقام الأول دائمًا.
سواء كنت تخوض عالم الكازينو
عبر الإنترنت للمرة الأولى أو كنت متحمسًا خبيرًا يبحث عن تجربة
مكررة، يعدك كازينو YYY بالإثارة والأناقة
في كل نقرة.
نجح كازينو YYY UAE في ترسيخ اسم قوي في
عالم القمار عبر الإنترنت، خاصة بين الناطقين
بالعربية. تأسس في عام 2018 وحاصل على ترخيص من
قوانين كوراكاو، يمثل YYY Casino مزيجًا من
التقاليد والحداثة، مصممًا لتلبية احتياجات المقامرين المتنوعين.
تغوص مراجعتنا في الميزات التي
تجعل من كازينو YYY الخيار الأمثل
للاعبين في الإمارات وحول العالم، مع التركيز
على المكافآت، وعروض الألعاب، ودعم العملاء، ومنصة سهلة الاستخدام.
الأمان ليس مجرد ميزة؛ إنه وعدنا.
في كازينو YYY، العب براحة بال، مع العلم أن بياناتك ومعاملاتك محمية بأحدث
إجراءات الأمان. منصتنا بديهية،
مما يتيح للمبتدئين والمقامرين ذوي الخبرة التنقل بسهولة
والعثور على ألعابهم المفضلة بسرعة.
Magnificent site. Plenty of helpful information here.
I am sending it to a few buddies ans also sharing in delicious.
And obviously, thanks for your sweat!
I think the admin of this website is actually working hard in support of his site,
since here every data is quality based data.
Oh my goodness! Impгessive ɑrticle ԁuԀe! Thanks, However I ɑm eхperiеncing problems wjth
your RSS. I don’t know thee reason why I cannot suƄscrіbe
to it. Is thеre anyone else getting the same RSS
problems? Anyone wһo knows the ѕolution can you kindlү
respond? Thаnx!!
Here is my website: eskort
I always spent my half an hour to read this web site’s articles or reviews daily
along with a cup of coffee.
Hi to every one, as I am really keen of reading this blog’s post to be updated on a regular basis.
It includes fastidious stuff.
Visit my web site – สมัคร LOTTOVIP
I pay a visit every day some websites and sites to read articles,
except this blog offers feature based posts.
I got this web page from my pal who shared with
me regarding this web page and now this time I am visiting this web site and reading very
informative posts at this time.
Highly energetic article, I liked that a lot. Will there be a part 2?
I do trust all of the concepts you’ve offered in your post.
They’re really convincing and can definitely work. Nonetheless, the posts are very quick for
starters. May just you please prolong them a
bit from subsequent time? Thanks for the post.
Normally I don’t learn post on blogs, however I
would like to say that this write-up very pressured me to try and do it!
Your writing style has been amazed me. Thanks, quite great article.
Good way of explaining, and pleasant paragraph to get information regarding my presentation focus, which i am going to convey in college.
Hey! This is my first visit to your blog! We are a group
of volunteers and starting a new initiative in a community in the same niche.
Your blog provided us valuable information to work
on. You have done a extraordinary job!
Thanks for finally writing about > Crearea unei baze de date Oracle – Make a Oracle
DataBase – eugo.ro < Loved it!
I’ve read some just right stuff here. Definitely value bookmarking for revisiting.
I surprise how so much attempt you put to make this
type of excellent informative web site.
I got this website from my pal who told me about this site and at
the moment this time I am browsing this website and
reading very informative posts here.
This is a topic that’s near to my heart… Thank you! Where are your contact details
though?
Do you have a spam problem on this website; I also am a blogger, and I was wondering your situation; many of us have developed some nice procedures and
we are looking to exchange methods with other folks,
please shoot me an e-mail if interested.
Excellent web site. Plenty of helpful information here.
I am sending it to several friends ans also sharing in delicious.
And of course, thank you to your effort!
Thanks for your marvelous posting! I seriously enjoyed reading it, you may be a
great author.I will always bookmark your blog and definitely will come back at some
point. I want to encourage yourself to continue your great posts, have a nice morning!
You can create your very own or conserve recipes shared by the
community.
Also visit my blog post free pokies aristocrat (https://wiki.xamun.com)
Your means of explaining everything in this piece of writing is actually nice, all can effortlessly know it, Thanks
a lot.
This is a topic which is close to my heart… Many thanks!
Where are your contact details though?
I know this website offers quality dependent articles and other data, is there
any other website which gives these stuff in quality?
Pretty component of content. I just stumbled upon your blog and in accession capital to claim that I acquire in fact enjoyed account your weblog posts.
Any way I will be subscribing to your augment and even I fulfillment you get entry to consistently fast.
Pretty! This was an incredibly wonderful post.
Thank you for providing this information.
میتونم این مطلب رو توی وبلاگ خودمم بزارم؟
Excellent post but I was wanting to know if you could write
a litte more on this subject? I’d be very thankful if you could
elaborate a little bit further. Appreciate it!
If you are going for finest contents like myself,
just visit this web page all the time because it gives quality
contents, thanks
What’s up it’s me, I am also visiting this web page on a regular basis,
this web page is in fact pleasant and the visitors are in fact sharing nice thoughts.
Howdy I am so excited I found your web site,
I really found you by error, while I was browsing on Google for something else,
Anyways I am here now and would just like to say thank you for a incredible post and a all round enjoyable blog (I also love the theme/design), I
don’t have time to go through it all at the minute but I have book-marked
it and also included your RSS feeds, so when I have time I
will be back to read a great deal more, Please do keep up the awesome work.
By establishing a strong foundation, you’ll develop an atmosphere where workers feel motivated and spent. Ultimately, clear goals will guide your technique, making your online workplaces not simply functional, yet flourishing rooms for advancement, https://www.gift-me.net/blogs/260943/Why-Businesses-Are-Adopting-Gamified-Virtual-Offices-to-Increase-Staff.
Uau! Estou realmente curtindo o modelo/tema
deste website. É simples, mas eficaz. Muitas vezes é muito difícil obter aquele
“equilíbrio perfeito” entre usabilidade e apelo
visual. Devo dizer que você um incrível trabalho com
isso. Além disso, o blog carrega super rápido para mim no Internet Explorer.
Excelente Blog!
It’s not my first time to go to see this site,
i am visiting this web page dailly and take pleasant facts from here everyday.
please visit my website rajatoto88
Hi, i think that i noticed you visited my weblog thus
i got here to return the prefer?.I am trying to to find issues to enhance my website!I
assume its ok to use some of your ideas!!
Greate post. Keep posting such kind of info on your blog.
Im really impressed by your site.
Hey there, You have done an excellent job. I will definitely digg it and personally recommend to my friends.
I’m confident they’ll be benefited from this
site.
This design is steller! You most certainly know how to keep a reader entertained.
Between your wit and your videos, I was almost moved to start my own blog (well,
almost…HaHa!) Fantastic job. I really enjoyed what you had to say,
and more than that, how you presented it. Too cool!
There is definately a lot to learn about this subject.
I like all the points you have made.
Marvelous, what a weblog it is! This webpage gives helpful data to us,
keep it up.
I always used to read article in news papers but now as I am a user of internet so from now I am using net for
articles or reviews, thanks to web.
Great post. I used to be checking continuously this blog and I
am impressed! Extremely useful information specifically the last part :
) I care for such information a lot. I was looking for this certain info for a
very lengthy time. Thank you and good luck.
If some one wishes to be updated with newest technologies afterward he must be visit this website and be up to date every day.
As the admin of this site is working, no uncertainty very shortly it will be renowned, due
to its feature contents.
Post writing is also a excitement, if you be acquainted
with after that you can write or else it is complicated to write.
You actually make it seem so easy with your presentation but I find this matter to be really something that I
think I would never understand. It seems too complex and extremely broad for me.
I am looking forward for your next post, I’ll try
to get the hang of it!
Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point.
You obviously know what youre talking about, why waste your intelligence on just posting videos to your blog
when you could be giving us something informative to read?
WOW just what I was looking for. Came here by searching for Extra resources
It’s very straightforward to find out any matter on net as compared to books, as I found this post at
this web site.
I must thank you for the efforts you have put in penning this site.
I really hope to view the same high-grade blog posts from you
later on as well. In fact, your creative writing abilities has
inspired me to get my own, personal site now 😉
you are in reality a excellent webmaster. The web site
loading speed is amazing. It kind of feels that you are doing any unique trick.
Furthermore, The contents are masterwork. you’ve done a wonderful job
in this matter!
I’m gone to say to my little brother, that he should also
go to see this weblog on regular basis to get updated from hottest information.
Wow that was unusual. I just wrote an incredibly long comment but after I clicked submit my comment didn’t
show up. Grrrr… well I’m not writing all that over again. Anyway, just wanted to say superb blog!
Hi, I check your blog regularly. Your humoristic style
is awesome, keep up the good work!
We are a gaggle of volunteers and starting a brand new scheme in our community.
Your website provided us with useful info to work on. You’ve done an impressive process and our entire group shall be grateful to
you. please visit my website Calototo
Hey there everyone,
Search engine optimization and online marketing are absolutely crucial in today’s ever-evolving business landscape.
Living in Illinois, I’ve seen how geo-targeted strategies significantly enhance online presence—especially for niche industries.
Nfinitelimits, a results-driven agency in Mundelein, IL, clearly excels
with customized solutions.
Their specialization in on-page Denver Local Seo (Fanajobs.Com) and
PPC campaigns greatly benefits businesses to thrive
in specific markets. Take their work|For instance successful
campaigns: they improve Google Business Profiles and utilize cutting-edge software to keep ahead
of algorithm changes. Combined with social media integration,
they craft holistic strategies.
For businesses aiming to revitalize your online presence, Nfinitelimits delivers concrete outcomes.
Their tailored plans ignite sustainable growth,
not jjust quick-fix solutions.
There is certainly a lot to know about this subject.
I like all of the points you have made.
hello!,I really like your writing so so much! share we be in contact more approximately your
article on AOL? I need an expert in this space to unravel my problem.
Maybe that is you! Having a look ahead to look you.
Excellent post. I’m experiencing some of these issues as well..
A properly maintained gas boiler not only guarantees reliable home heating however also translates into significant financial cost savings over time. By scheduling normal central heating boiler inspections, you can identify and rectify tiny concerns prior to they rise into pricey repair work. An appropriately functioning central heating boiler operates extra efficiently, which implies lower power bills, https://www.designnominees.com/profile/graham.
This site was… how do you say it? Relevant!! Finally I have found something
that helped me. Appreciate it!
Attractive section of content. I just stumbled upon your web site and
in accession capital to assert that I acquire in fact enjoyed account your blog posts.
Any way I’ll be subscribing to your augment and even I achievement you access consistently
fast.
Remarkable! Its really awesome piece of writing, I have got much clear idea on the topic
of from this piece of writing.
I’m really inspired together with your writing abilities and also with the structure to your weblog.
Is this a paid subject or did you modify it yourself? Anyway stay up the excellent high quality writing, it’s uncommon to peer
a great blog like this one nowadays..
wonderful points altogether, you simply won a new reader.
What might you recommend about your put up that you simply made some days in the past?
Any certain?
Greate pieces. Keep writing such kind of information on your blog.
Im really impressed by it.
Hi there, You’ve done a great job. I will certainly digg it and in my opinion suggest
to my friends. I’m confident they’ll be benefited from this site.
You really make it seem so easy together with your presentation but I in finding this topic to be actually one thing that
I think I’d by no means understand. It kind of feels too complex and very wide for me.
I am taking a look forward in your next put up, I’ll try to get the cling of
it!
Excellent website you have here but I was curious if you
knew of any forums that cover the same topics discussed here?
I’d really like to be a part of community where I can get comments from other knowledgeable people that share the same interest.
If you have any recommendations, please let me know. Thanks a lot!
Hi there, its pleasant post about media print, we all know media is a
enormous source of facts.
My spouse and I stumbled over here from a different page and thought I might as well
check things out. I like what I see so now i’m following you.
Look forward to finding out about your web page again.
Today, I went to the beachfront with my children. I
found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.”
She placed the shell to her ear and screamed. There was a hermit crab inside and it pinched her ear.
She never wants to go back! LoL I know this is totally off topic but I had to tell someone!
Pretty nice post. I just stumbled upon your weblog and wished to say that I’ve really enjoyed browsing your blog
posts. After all I will be subscribing in your rss feed and I’m hoping you write again soon!
I was recommended this blog by my cousin. I’m not sure
whether this post is written by him as no one else know such
detailed about my difficulty. You’re amazing! Thanks!
We’re a group of volunteers and starting a new scheme
in our community. Your website offered us with valuable
information to work on. You’ve done an impressive job and our entire community will be thankful to you.
Thanks for the auspicious writeup. It in fact was a enjoyment account it.
Glance advanced to more delivered agreeable from you! However, how can we communicate?
в список поддерживаемых систем платежей входит «Ю-Мани», qiwi, https://s-zametki.ru/virtualnye-nomera-turczii-udobstvo-i-bezopasnost-v-odnom-reshenii.html payeer и webmoney.
2.
Hi there! I could have sworn I’ve been to this site
before but after browsing through some of the post I realized it’s new to me.
Nonetheless, I’m definitely happy I found it and I’ll be book-marking and checking back
frequently!
I don’t even know how I finished up here, however I assumed this submit
was once good. I don’t realize who you’re but definitely you’re going to
a well-known blogger if you aren’t already. Cheers!
Keep this going please, great job!
Thank you, I have just been looking for information approximately
this topic for a long time and yours is the best I have discovered so far.
But, what about the bottom line? Are you sure concerning
the supply?
Amazing! Its really awesome article, I have got much clear idea about from this paragraph.
Hey fantastic blog! Does running a blog such as this take a
lot of work? I have no understanding of coding however I had been hoping to start my own blog soon. Anyways, if you have any ideas
or tips for new blog owners please share. I understand this is off topic nevertheless
I just wanted to ask. Thank you!
WOW just what I was looking for. Came here
by searching for تعمیرات مک بوک ایر
Hey! Do you use Twitter? I’d like to follow you if that would be
okay. I’m undoubtedly enjoying your blog and look forward to new posts.
each time i used to read smaller articles which as well clear their motive, and that is also happening with this
article which I am reading at this time.
https://gitlab.ineum.ru/twilawaterman tags are small, benign growths that often appear on areas of the skin where friction is common, such as the neck, armpits, groin, eyelids, and beneath the breasts.
Many merchants use unique discounts to email clients, so it’s worth inspecting your inbox for potential financial savings. You ‘d marvel how many people miss out on these types of offers simply because they really did not look, https://www.fundable.com/alonzo-dudley.
Oh my goodness! Impressive article dude! Many thanks, However I am having issues with your
RSS. I don’t know why I cannot subscribe to it. Is there anybody
getting the same RSS problems? Anybody who knows the solution can you kindly respond?
Thanx!!
Consider the overall cost of possession, not just the in advance cost. By approaching settlements with a clear method and notified point of view, you can safeguard favorable terms that enhance your profitability and ensure the durability of your solar projects, https://anabellabrown3.contently.com/.
It’s going to be finish of mine day, except before
end I am reading this great article to improve my experience.
Unquestionably believe that that you stated. Your favorite justification seemed to be on the web the simplest factor to keep in mind of.
I say to you, I certainly get irked at the same time as other folks think about concerns that they plainly do not understand about.
You controlled to hit the nail upon the top
and also defined out the whole thing without having side-effects , other people could take a
signal. Will probably be back to get more. Thanks
Hey there readers,
Search engine optimization and online marketing are essential inn today’s ever-evolving business landscape.
Living in Illinois, I’ve witnessed how geo-targeted strategies dramatically boost online presence—especially for specialized industries.
Nfinitelimits, a top-tier agency iin the Mundelein area,
distinguishes itself with personalized solutions.
Their specialization in on-page yoast local seo changelog (http://www.yourknownjobs.com) and diogital advertising substantially helps businesses to excel inn specific
markets. For example|Consider their successful campaigns: they optimize Google
Business Prifiles and employ state-of-the-art
technology to keep ahead of algorithm changes.
Alongskde social media integration, they create comprehensive plans.
Should you be aiming to scale your online visibility, their team ensures visible
success. Their tailored plans drive genuine growth,not just short-term solutions.
Dealers do not leave scope for fantasies , and among them are pornstars Monique Alexander https://showdream.org/user/t3pzfos291 and Dani
Daniels.
When changing the value of the https://www.reddotforum.com/forums/topic/autodesk-inventor/ parameter, it affects on only one or multiple dynamic attributes within the block.
Wһy viewers stilⅼ use tⲟ read news paperѕ when in this
technologiϲal world the wholе thing is available on net?
Cһeck out my homepage – webpage
At this time it looks like Drupal is the best blogging platform out there right now.
(from what I’ve read) Is that what you’re using on your blog?
My brother suggested I might like this website.
He was entirely right. This post truly made my day.
You can not imagine just how much time I had spent for this information! Thanks!
Exceptional post however I was wanting to know if you
could write a litte more on this subject? I’d be very thankful
if you could elaborate a little bit further. Thank you!
take a look at mega Moolah immortal romance, jackpot rango, super multiplier progressive, https://foxtrot-wiki.win/index.php/888Starz_Mobile_App_Sri_Lanka and some optimal games, to get
a chance hit the jackpot on every spin.
After looking over a number of the blog posts on your web page,
I honestly like your way of blogging. I added it to my bookmark webpage list and will be checking back
in the near future. Please check out my web site
too and let me know how you feel.
Hey, I think your website might be having browser compatibility
issues. When I look at your blog in Chrome,
it looks fine but when opening in Internet Explorer, it has some overlapping.
I just wanted to give you a quick heads up!
Other then that, very good blog!
Quality articles is the important to attract the viewers to pay a visit the
site, that’s what this web site is providing.
Heya! I’m at work surfing around your blog from my new iphone
3gs! Just wanted to say I love reading your blog
and look forward to all your posts! Keep up the outstanding work!
Everything is very open with a really clear clarification of the issues.
It was truly informative. Your site is very helpful.
Thanks for sharing!
What i do not realize is in fact how you’re no longer really a lot more neatly-liked than you
may be now. You are very intelligent. You understand thus significantly
relating to this matter, made me individually imagine it from numerous varied angles.
Its like men and women are not fascinated until it is one thing to do with Lady gaga!
Your own stuffs excellent. At all times handle it up!
It was a diamond hits http://login.tiscali.cz/?url=https://bc-game-italy.com/ game,
and it allowed me to use cryptocurrencies to the maximum free minutes spent in excitement on our
website.
Very nice post. I just stumbled upon your blog and wished
to say that I have really enjoyed browsing your
blog posts. In any case I’ll be subscribing to your rss feed and
I hope you write again soon!
Fantastic goods from you, man. I’ve be aware your stuff prior to and you are simply extremely great.
I actually like what you have received right here, really like what you’re saying and the way in which during which you assert it.
You are making it enjoyable and you still take care of to keep
it wise. I can not wait to learn much more from you.
That is really a terrific website.
That is a very good tip particularly to those fresh to the
blogosphere. Simple but very precise info… Thanks for sharing this one.
A must read article!
This is really interesting, You’re a very skilled blogger.
I’ve joined your rss feed and look forward to seeking more of
your magnificent post. Also, I’ve shared your site in my
social networks!
Hello, I think your website might be having browser compatibility
issues. When I look at your website in Firefox, it
looks fine but when opening in Internet Explorer, it has
some overlapping. I just wanted to give you a quick heads up!
Other then that, amazing blog!
It’s going to be end of mine day, except before ending I am
reading this wonderful article to increase my know-how.
I am regular reader, how are you everybody?
This article posted at this site is really good.
Thank you for any other informative site. The place else may I get that kind of
info written in such a perfect approach? I have a challenge that I’m just now running on, and I have
been on the look out for such information.
An outstanding share! I’ve just forwarded this
onto a colleague who was doing a little homework on this.
And he actually bought me lunch simply because I discovered it for him…
lol. So let me reword this…. Thank YOU for the meal!!
But yeah, thanks for spending the time to discuss this
topic here on your blog.
Vital press releases are Influencing media Messages.
They Support Forge Rapport between Organizations
and Reporters. Developing Impactful press reloeases Involves being Focused, Matched
with the Needs of Relevant Media Platforms. Given Digital
Advancements,press releasses Further Function Important
role in Online PR Strategies. They Reach Classic news outlets
Furthermore Boost Interest and Enhance a Company’s Online Footprint.
Incorporating Visuals, such as Photos, can Render press releases More Captivating and Distributable.
Adapting to the Developing media Sphere
while Uphoklding core Principles can Greatly Increase
a Press Release – blog.Cameseeing.Com -‘s Influence.
What’s Your Take on Using multimedia in News Releases?
Hi there, I discovered your site via Google whilst looking for a comparable matter, your
web site got here up, it appears great. I’ve bookmarked it in my google bookmarks.
Hello there, just became alert to your blog via Google, and found that it is truly informative.
I’m gonna be careful for brussels. I’ll appreciate in case
you continue this in future. Numerous other folks shall be
benefited out of your writing. Cheers!
Link exchange is nothing else but it is simply placing the other person’s webpage link on your page at
appropriate place and other person will also do similar in support of you.
I have been surfing online more than 4 hours today,
yet I never found any interesting article like yours.
It is pretty worth enough for me. In my opinion, if all site owners and bloggers made good content as you did, the web will
be a lot more useful than ever before.
This is really fascinating, You are an excessively skilled blogger.
I have joined your feed and look ahead to seeking extra of
your fantastic post. Additionally, I’ve shared your website in my social networks
Three humidors are filled with 50 montecristo l’espirit cigars
– 150 in total – and placed in a other spacious https://zorgjungle.nl/?p=46857.