Baze de date
Evolutia bazelor de dateEvolutia bazelor de date Istoria bazelor de date si a sistemelor de gestiune a bazelor de date poate fi rezumata in trei generatii: sisteme ierarhice si retea, sisteme relationale, sisteme avansate (orientate obiect, relationale orientate obiect, deductive, distribuite, multimedia, multibaze, active, temporale, decizionale, magazii de date etc.). Baze de date ierarhice si retea Pentru modelele ierarhice si retea, datele sunt reprezentate la nivel de articol prin legaturi ierarhice (arbore) sau de tip graf. Slaba independenta fizica a datelor complica administrarea si prelucrarea acestora. Limbajul de prelucrare a datelor impune programatorului sa specifice drumurile de acces la date. Baze de date relationale A doua generatie de SGBD-uri este legata de aparitia modelelor relationale (1970), care trateaza entitatile ca niste relatii. Piata actuala de baze de date este acoperita in majoritate de sisteme relationale. Bazele de date relationale sunt caracterizate de: structuri de date simple, intuitive, inexistenta pointerilor vizibili pentru utilizator, constrangeri de integritate, operatori aplicati relatiilor care permit definirea, cautarea si reactualizarea datelor. Dezvoltarea unei aplicatii riguroase utilizand o baza de date relationale necesita cunoasterea a trei niveluri de instrumente, eterogene din punct de vedere conceptual: nivelul instrumentelor grafice (interfata); nivelul aplicatie, cu limbajele sale de dezvoltare; nivelul SGBD, cu standardul SQL (Structured Query Language) ce permite definirea, prelucrarea si controlul bazei de date. Baze de date orientate obiect Bazele de date relationale nu folosesc insa obiecte complexe si dinamice, nu realizeaza gestiunea datelor distribuite si nici gestiunea cunostintelor. A treia generatie de SGBD-uri, sistemele avansate, incearca sa depaseasca aceste limite ale sistemului relational. Suportul obiectelor complexe si dinamice si prelucrarea acestora este dificila pentru sistemele relationale, deoarece tipul datelor este limitat la cateva domenii alfanumerice, iar structura datelor este simpla. Sistemele relationale nu modeleaza obiecte complexe ca grafuri, liste etc. Un obiect complex poate sa fie descompus in relatii, dar apar dificultati atat la descompunerea, cat si la refacerea acestuia prin compunere. De asemenea, limbajele modelului relational permit prelucrarea cu dificultate a obiectelor complexe. Un sistem relational nu suporta obiecte dinamice care incorporeaza atat partea de date (informatii) efective, cat si o parte relativa la tratarea acestora. Imbinarea tehnicii limbajelor orientate obiect cu a bazelor de date a permis realizarea bazelor de date orientate obiect. Acestea permit organizarea coerenta a obiectelor partajate intre utilizatori concurenti. Sistemele de gestiune de baze de date orientate obiect (SGBDOO) prezinta o serie de avantaje: realizeaza o modelare superioara a informatiei, furnizeaza posibilitati superioare de deductie (ierarhie de clase, mostenire), permit luarea in considerare a aspectelor dinamice si integrarea descrierii structurale si comportamentale, asigura imbunatatirea interfetei cu utilizatorul. Cu toate avantajele incontestabile oferite de SGBDOO-uri, impunerea lor pe piata bazelor de date nu a fost usoara. Cateva motivatii a acestei situatii: absenta unei fundamentari teoretice face imposibila definirea unui SGBDOO de referinta; gestiunea obiectelor complexe este mai dificila decat accesul la relatii prin cereri SQL; utilizatorii au investit sume uriase in sistemele relationale si nu le pot abandona cu usurinta. Trecerea la noua tehnologie orientata obiect implica investitii mari si nu pastreaza aproape nimic din vechile solutii. Baze de date relationale orientate obiect Simplitatea modelului relational, combinata cu puterea tehnologiei orientate obiect a generat un domeniu nou si promitator in lumea bazelor de date, si anume bazele de date relationale orientate obiect. Constructia unui sistem de gestiune de baze de date relationale orientate obiect (SGBDROO) trebuie sa porneasca de la cele existente. Aceasta se poate realiza in doua moduri: dezvoltand un sistem relational prin adaugarea caracteristicilor obiectuale necesare sau pornind de la un sistem orientat obiect si adaugand caracteristicile relationale. Baze de date deductive O relatie este o multime de inregistrari ce reprezinta fapte. Cunostintele sunt asertiuni generale si abstracte asupra faptelor. Cunostintele permit sa rationezi, ceea ce permite deducerea de noi fapte, plecand de la fapte cunoscute. Un SGBD relational suporta o forma limitata de cunostinte, si anume constrangerile de integritate, iar restul trebuie integrate in programele de aplicatie. Aceasta genereaza probleme deoarece cunostintele trebuie codificate in programe si apare imposibilitatea de a partaja cunostinte intre utilizatori. Totul se complica daca exista un volum mare de fapte. Bazele de date deductive, utilizand programarea logica, gestioneaza cunostinte relativ la baze de date care, in general, sunt relationale. Bazele de date deductive permit deducerea de noi informatii, plecand de la informatiile stocate in baza de date. Un SGBD deductiv poseda: un limbaj de definire a datelor care permite definirea structurii predicatelor sub forma de relatii si constrangeri de integritate asociate; un limbaj de prelucrare a datelor care permite efectuarea reactualizarilor asupra datelor si formularea unor cereri; un limbaj de reguli de deductie care permite ca, plecand cu predicatele definite anterior, sa se specifice cum pot fi construite predicate derivate. Baze de date distribuite Un sistem distribuit este un ansamblu de masini ce sunt interconectate printr-o retea de comunicatie si utilizate intr-un scop global. Administrarea si prelucrarea datelor distribuite, situate pe diferite calculatoare si exploatate de sisteme eterogene este obiectivul fundamental al bazelor de date distribuite. Bazele de date distribuite sunt sisteme de baze de date cooperante care rezida pe masini diferite, in locuri diferite. Aceasta multime de baze de date este exploatata de utilizator ca si cum ar fi o singura baza de date. Programul de aplicatie care exploateaza o baza de date distribuite poate avea acces la date rezidente pe mai multe masini, fara ca programatorul sa cunoasca localizarea datelor. Modelul relational a ramas instrumentul principal prin care se realizeaza prelucrarea datelor distribuite. Cateva dintre argumentele pentru a justifica aceasta afirmatie sunt: bazele relationale ofera flexibilitate de descompunere in vederea distribuirii; operatorii relationali pot fi folositi pentru combinatii dinamice ale informatiilor descentralizate; limbajele sistemelor relationale sunt concise si asigura o economie considerabila a transmiterii datelor. Ele fac posibil, pentru un nod oarecare al retelei, sa analizeze intentia unei tranzactii, sa o descompuna rapid in componente ce pot fi realizate local si componente ce pot fi transportate altor noduri. Calculatoare si masini baze de date Solutia pentru a descentraliza prelucrarea datelor, in scopul evitarii saturarii memoriei si a procesoarelor calculatorului central, a fost aparitia calculatoarelor baze de date si a masinilor baze de date. Descentralizarea presupune transferarea unei parti din functiile unui SGBD catre un calculator periferic (calculator backend) adica deplasarea algoritmilor de cautare si a celor de actualizare a datelor mai aproape de memoria secundara. Acest calculator periferic permite utilizarea optima a resurselor si realizarea paralelismului in tratarea cererilor de informatii.
Calculatorul periferic poate fi un calculator clasic, dar cu un software specific de SGBD (calculator baza de date) sau poate fi o masina cu hardware specializat in gestiunea bazelor de date (masina baza de date). Masinile baze de date sunt inzestrate cu arhitecturi paralele special adaptate pentru gestionarea unui volum mare de date. Tratarea paralela a cererilor permite reducerea timpului total de executie a acestora. O executie in paralel solicita, fie descompunerea unui program in module, care pot fi executate in paralel (descompunere functionala), fie descompunerea datelor in subgrupe, astfel incat toate procesoarele sa execute acelasi lucru, dar pe date diferite. Performantele tratarii paralele depind de modul in care sunt efectuate descompunerile. Multibaze de date Diferite departamente ale unei organizatii mai mari pot folosi diferite sisteme de gestiune. Cu toate ca fiecare sistem este dezvoltat pentru a satisface nevoile propriului sau departament, informatiile cu care lucreaza pot fi utile si altor departamente. De aceea, pentru ca organizatia sa functioneze bine, trebuie sa existe o modalitate globala da a vedea datele din fiecare sistem. Exista doua caracteristici ale unor astfel de sisteme care fac acceasarea datelor in acest mediu integrat greoaie, uneori chiar imposibila: autonomie – fiecare SGBD are o autonomie completa, ceea ce inseamna ca fiecare manager are control deplin asupra sistemului; eterogenitate – sistemele pot opera pe diferite platforme, cu diferite modele de date si limbajele de interogare. Una dintre solutiile folosite pentru a depasi dificultatile intampinate in respectarea autonomiei si a eterogenitatii este utilizarea sistemelor multibaze de date. Un sistem multibaze de date (SMB) este alcatuit din mai multe sisteme de baze de date privite integrat, in care se construiesc una sau mai multe scheme globale pe baza schemelor fiecarei baze de date componente, astfel incat sa se poata realiza accesul uniform si integrat la fiecare din bazele de date componente. Fiecare schema globala este construita pe baza unui model particular de date. De exemplu, se poate construi o schema globala ce are la baza modelul relational pentru utilizatorii care sunt familiarizati cu acest model, dar se poate construi o schema globala bazata pe modelul orientat obiect pentru utilizatorii bazelor de date orientate obiect. Pentru o schema globala data, un sistem multibaze de date consta din sistemele componente impreuna cu un sistem front‑end, care suporta un singur model de date si un singur limbaj de interogare. Principalele sarcini ale sistemului front-end sunt gestionarea schemei globale si procesarea cererilor globale. Un avantaj major al acestui model, fata de altele, este faptul ca o singura interogare poate accesa date din mai multe baze de date intr-un mod integrat, fara sa afecteze nici o aplicatie care este scrisa utilizand una dintre bazele de date componente. Baze de date cu suport decizional Sistemele informatice, in particular bazele de date, au ajuns la maturitate. Marile companii au acumulat o mare cantitate de informatii din domeniul lor de activitate, pe care le pastreaza in tabele istorice si sunt nefolositoare sistemelor operationale ale companiei, care functioneaza cu date curente. Analizate, aceste date ar putea oferi informatii despre tendinte si evolutii care ar putea interesa compania. Pentru a putea analiza aceste mari cantitati de date este nevoie de tehnologii si instrumente speciale. Ideea de a analiza colectii de date provenind din sistemele operationale ale companiei sau din surse externe pentru a le folosi ca suport in procesul de decizie nu apartine ultimului deceniu, dar baze de date care sa functioneze eficient dupa aceste criterii au fost studiate si implementate in ultimii ani. Principalul scop al acestor baze de date a fost de a intampina nevoile sistemelor operationale, a caror natura este inerent tranzactionala. Sistemele tranzactionale sunt interesate, in primul rand, sa controleze la un moment dat o singura tranzactie. De exemplu, intr-un sistem bancar, atunci cand clientul face un depozit, sistemul operational bancar este responsabil de a inregistra tranzactia intr-un tabel al tranzactiilor si de a creste nivelul curent al contului clientului, stocat in alt tabel. Un sistem operational tipic opereaza cu evenimente predefinite si, datorita naturii lor, necesita acces rapid la date. Uzual, fiecare tranzactie opereaza cu cantitati mici de date. De-a lungul timpului, nevoile sistemelor operationale nu se schimba mult. Aplicatia care inregistreaza tranzactia, ca si cea care controleaza accesul utilizatorului la informatie (partea de raportare a sistemului bancar), nu se modifica prea mult. In acest tip de sistem, informatia necesara in momentul in care un client initiaza o tranzactie trebuie sa fie actuala. Inainte ca o banca sa aprobe un imprumut este nevoie sa se asigure de situatia financiara stabila a clientului in acel moment, si nu cu un an inainte. In ultimii ani s-au pus la punct principii si tehnologii noi care sa serveasca procesului de analiza si administrare a datelor. O baza de date optimizata in acest scop defineste o Data Warehouse (magazie de date), iar principiul pe care il urmeaza este cunoscut sub numele de procesare analitica (OLAP – On Line Analytical Processing). Spre deosebire de acesta, principiul pe care se bazeaza sistemele tranzactionale a fost numit procesare tranzactionala (OLTP – On Line Transactional Processing). Aplicatiile unei Data Warehouse trebuie sa ofere raspunsuri unor intrebari de tipul: „Care zi din saptamana este cea mai aglomerata?“ „Ce clienti, cu care avem relatii intense, nu au beneficiat de reduceri de preturi?“. O caracteristica a bazelor de date analitice este ca interogarile la care acestea trebuie sa raspunda sunt ad-hoc, nu sunt predefinite, iar baza de date trebuie optimizata astfel incat sa fie capabila sa raspunda la orice fel de intrebare care poate implica mai multe tabele. In aceasta abordare, organele generale de decizie necesita accesul la toate datele organizatiei, oriunde s-ar afla acestea. Pentru o analiza corespunzatoare a organizatiei, afacerilor, cerintelor, tendintelor este necesara nu numai accesarea valorilor curente din baza de date, ci si a datelor istorice. Prin urmare, pentru a facilita acest tip specific de analiza a informatiei a fost creata magazia de date, care contine informatii extrase din diverse surse, intretinute de diverse unitati operative, impreuna cu istoricul si rezumatul tranzactiilor. Sursele de date pentru o magazie cuprind: date operationale, pastrate in baze de date ierarhice, de prima generatie; date departamentale, pastrate in sisteme de fisiere patentate; date cu caracter personal, pastrate pe statii de lucru si servere personale; sisteme externe (baze de date comerciale, Internet etc.) Data warehouse este o colectie de date: orientate spre subiect (principalele subiecte ale modelului sunt clientii, produsele, vanzarile, in loc de domeniile de activitate), nevolatile (datele nu sunt reactualizate, inlocuite in timp real, ci sunt adaugate ca un supliment al bazei), integrate (transpunerea datelor provenite din diverse surse de informatii se face intr-un format consistent), variabile in timp (concentrarea depozitului de date se face asupra schimbarilor care au loc in timp).
Fig 1.2. Arhitectura unui depozit de date Inmagazinarea datelor se concentreaza asupra gestionarii a cinci fluxuri de informatii: fluxul intern, care reprezinta procesele asociate extragerii si incarcarii datelor din fisierele sursa in magazia de date; fluxul ascendent, care reprezinta procesele asociate adaugarii de valoare datelor din magazie, cu ajutorul impachetarii si distribuirii; fluxul descendent, care reprezinta procesele asociate arhivarii, salvarii, refacerii datelor din magazie; fluxul extern, care reprezinta procesele asociate punerii la dispozitie a datelor pentru utilizatorii finali; meta-fluxul, care reprezinta procesele asociate gestionarii meta-datelor (date despre date). In arhitectura depozitului de date intervin cateva componente specifice acestei structuri. Administratorul pentru incarcarea datelor (componenta front-end) realizeaza toate operatiile asociate cu obtinerea (extragerea) si incarcarea datelor operationale intr-un depozit de date. Administratorul depozitului de date realizeaza toate operatiile legate de administrarea datelor din depozit. Operatiile realizate de componenta de administrare a depozitului de date includ: analiza datelor pentru a asigura consistenta acestora; transformarea si mutarea datelor sursa din structurile temporare de stocare in tabelele depozitului de date; crearea de indecsi si vizualizari asupra tabelelor de baza; generarea denormalizarii (daca este necesar); generarea agregarilor; crearea arhivelor si a backup-urilor. Administratorul cererilor (componenta back-end) realizeaza toate operatiile legate de administrarea cererilor utilizator. Aceasta componenta este construita folosind utilitarele de acces la date disponibile utilizatorilor finali, utilitarele de monitorizare a depozitului de date, facilitatile oferite de sistemul de baze de date si programele personalizate. In zona ce include date agregate sunt stocate toate agregarile predefinite de date, pe diferite niveluri. Scopul, mentinerii acestora, este de a mari performanta cererilor care necesita agregari. Datele agregate sunt actualizate permanent, pe masura ce sunt incarcate noi informatii in depozit. Scopul principal al depozitelor de date este de a oferi informatii necesare utilizatorilor pentru luarea deciziilor strategice de marketing. Acesti utilizatori interactioneaza cu depozitul de date prin diferite utilitare de acces (utilitare pentru rapoarte si cereri, utilitare pentru dezvoltarea aplicatiilor, utilitare pentru procesarea analitica on-line (OLAP), utilitare data mining) etc. Instrumentele de acces pentru utilizatorii finali ai magaziilor de date: prelucrarea analitica on-line; extensiile limbajului SQL; instrumentele de extragere a datelor. Prelucrarea analitica on-line (OLAP) reprezinta sinteza, analiza si consolidarea dinamica a unor volume mari de date multidimensionale. Serverele de baze de date OLAP utilizeaza structuri multidimensionale pentru stocarea datelor si a relatiilor dintre date. Aceste structuri pot fi vizualizate prin cuburi de date si cuburi in cadrul cuburilor etc. Fiecare latura a cubului reprezinta o dimensiune. Serverele de baze de date OLAP multidimensionale accepta operatiile analitice uzuale: consolidarea (gruparea), parcurgerea in jos (inversul consolidarii), transarea, taierea. OLAP necesita o modalitate de agregare a datelor conform mai multor grupari diferite, in numar foarte mare, iar utilizatorii trebuie sa le aiba in vedere pe toate. Instrumentele OLAP presupun organizarea informatiei intr-un model multidimensional care este sustinut de o baza de date: multidimensionala (MOLAP), in care datele sunt stocate conceptual in celulele unui tablou multidimensional; relationala (ROLAP), proiectata pentru a permite interogari multidimensionale. In acest context, a devenit o necesitate extinderea limbajului SQL prin operatii puternice, necesare pentru rezolvarea noului tip de abordare. Au fost introduse noi functii numerice (limita inferioara, limita superioara etc.), noi functii statistice (distributie, distributie inversa, corelatie etc.), noi operatori de agregare, extensii ale clauzei GROUP BY etc. De exemplu, RISQL (Red Brick Intelligent SQL), proiectat pentru analistii din domeniul afacerilor, permite: ordonare dupa rang (pe diferite niveluri - de exemplu, gruparea filialelor in trei categorii pe baza venitului generat in anul precedent), partajarea pietei, compararea anului curent cu cel precedent etc. O alta problema esentiala este extragerea datelor si utilizarea acestora pentru luarea de decizii cruciale in domeniul afacerilor. Descoperirea unor noi corelatii, tipare, tendinte, prin extragerea unor cantitati mari de date folosind strategia inteligentei artificiale este una din modalitatile de rezolvare. Extragerea datelor presupune capacitatea de a construi modele mai degraba previzibile, decat retrospective. Modelarea predictiva utilizeaza informatii pentru a forma un model al caracteristicilor importante ale unui fenomen. Tehnicile asociate operatiilor fundamentale de extragere sunt: modelarea predictiva (clasificarea cu ajutorul unei retele neurale sau al unei inductii de tip arbore si previziunea valorilor, utilizand tehnici de regresie); segmentarea bazei de date (comasarea demografica si comasarea neurala care se deosebesc prin metodele uilizate pentru a calcula distanta dintre inregistrari, prin intrarile de date permise); analiza legaturilor (descoperirea asocierilor, descoperirea tiparelor, descoperirea secventelor de timp similare); detectarea deviatiilor (statistici si vizualizari pentru identificarea imprastierii datelor, utilizand tehnici moderne de vizualizare grafica). In aceasta clasa pot fi considerate, de exemplu, detectarea fraudelor privind utilizarea cartilor de credit, pretentiile de despagubire ale asiguratilor etc. In concluzie, spre deosebire de un sistem OLTP, Data Warehouse este o baza de date a carei structura este proiectata pentru a facilita analiza datelor. Un sistem de suport decizional urmareste, in primul rand, obtinerea de informatii din baza de date, in timp ce unul OLTP urmareste introducerea de informatii in baza de date. Datorita acestor diferente, structura optima a unei Data Warehouse este radical diferita de cea a unui sistem OLTP. Depozitele de date si sistemele OLTP sunt supuse unor cerinte diferite, dintre care cele mai semnificative se refera la operatii, actualizarea datelor, proiectare, operatii tipice si date istorice. Operatii Depozitele sunt create pentru a permite interogari ad hoc. Ele trebuie sa fie suficient de flexibile pentru a putea raspunde interogarilor spontane ale utilizatorilor. Sistemele OLTP suporta numai operatii predefinite. Aplicatiile pot fi optimizate sau create special numai pentru acele operatii. Actualizarea datelor Utilizatorii finali ai unui depozit de date nu fac in mod direct actualizari ale depozitului. In sistemele OLTP, utilizatorii realizeaza, de obicei, in mod individual procedurile de modificare a bazei de date. In acest fel, baza de date OLTP este intotdeauna la zi si reflecta starea curenta a fiecarei tranzactii. Proiectare Depozitele de date folosesc, in mod uzual, scheme denormalizate, in timp ce sistemele OLTP folosesc scheme normalizate pentru a optimiza performantele operatiilor. Operatii tipice O simpla interogare a depozitului de date poate scana mii sau chiar milioane de inregistrari (de exemplu, cererea „Care sunt vanzarile totale catre toti clientii din luna trecuta?“), in timp ce o operatie tipica OLTP acceseaza doar o parte mai mica din inregistrari. Date istorice Depozitele de date stocheaza datele pe o perioada lunga de timp, luni sau ani. Acest lucru ofera suport pentru analiza istorica a informatiei. Sistemele OLTP retin date istorice atat timp cat este necesar pentru a indeplini cu succes cerintele tranzactiilor curente.
Fig. 1.3. OLTP versus Data Warehouse O baza de date OLAP poate fi relationala, dar datorita naturii ei orientate spre dimensiuni, au fost dezvoltate pentru gestionarea acestor baze de date constructii multidimensionale, mai potrivite pentru o raportare flexibila. Spre deosebire de bazele de date relationale, structura unei baze de date multidimensionale nu implica tabele, linii si coloane, ci obiecte de urmatoarele tipuri: variabile, dimensiuni, niveluri, ierarhii, atribute. Data Warehouse, care cuprinde de obicei informatii despre o intreaga companie, poate fi subimpartita in baze de date departamentale, numite rafturi de date (Data Marts). De exemplu, poate exista un Data Mart al departamentului financiar, un altul al departamentului vanzari si un altul pentru departamentul marketing. Constructia unei astfel de baze de date poate fi abordata in doua moduri. O prima abordare este de a construi mai intai un schelet al bazei de date la care se lipesc ulterior rafturile de date. Aceasta necesita o analiza prealabila a intregului si o delimitare a blocurilor componente. Ea cere un timp mai lung de dezvoltare, dar rezultatul este o baza de date unitara. A doua metoda este de a construi mai intai rafturi specifice, efortul constand, in acest caz, in asocierea acestora. Aceasta solutie ofera mai rapid, aplicatii functionale utilizatorilor, dar au de suferit unitatea si portabilitatea aplicatiilor finale. Utilizatorii trebuie sa-si schimbe optica asupra bazelor de date pentru a fi capabili sa foloseasca puterea si flexibilitatea instrumentelor analitice de care dispun. Instrumentele OLAP au evoluat ca o modalitate de a rezolva interogarile complicate necesare procesului de analiza a datelor. Combinatia intre bazele de date multidimensionale si instrumentele analitice prietenoase face usoara analiza, sinteza si consolidarea datelor. In ultimii ani, marii producatori de sisteme de gestiune a bazelor de date relationale, precum Oracle, au introdus in produsele lor constructii care sa faciliteze accesul la datele din sistemele fundamentale pentru luarea de decizii. Astfel, noile versiuni de SGBD-uri ale firmelor mari prevad o modalitate mai inteligenta de a realiza operatia de compunere intre doua sau mai multe tabele, metode de indexare noi, potrivite pentru marile cantitati de date statice cu care opereaza sistemele Data Warehouse, capacitatea de a detecta si optimiza interogari de un tip special, posibilitatea de a folosi mai multe procesoare pentru a rezolva o interogare. Un sistem Data Warehouse are un efect fundamental asupra utilizatorilor. Ei pot manevra mult mai flexibil sistemul, au posibilitati elevate pentru interogarea datelor, dar ei trebuie sa stie cum sa prelucreze si sa vizualizeze datele si cum sa le foloseasca in procesul de decizie. Un efort ce trebuie facut pentru construirea unui sistem de suport pentru decizii (DSS – Decision Support System) consta in procesul de descoperire a informatiilor utile din baza de date. Acest proces, numit Data Mining sau Knowledge Discovery in Databases (KDD), proceseaza mari cantitati de date, a caror corelare nu este neaparat evidenta, in vederea descoperirii de tendinte si tipare.
|