480 likes | 674 Views
Najib OURADI- Insea 2013-2014. Bases de données avancées. Rappel atouts du modèle relationnel. Un modèle simple pour l’utilisateur BD = ensemble de tables Un modèle formellement bien fondé algèbre → implantation et optimisation calcul → BD logique Une méthode de conception de schéma
E N D
Najib OURADI-Insea 2013-2014 Bases de données avancées
Rappel atouts du modèle relationnel • Un modèle simple pour l’utilisateur • BD = ensemble de tables • Un modèle formellement bien fondé • algèbre → implantation et optimisation • calcul → BD logique • Une méthode de conception de schéma • normalisation • Un langage de manipulation de données universel • SQL • Un modèle de transactions sûr • sérialisabilité et verrouillage à 2 phases • Des SGBD commerciaux ou libres performants • Access, DB2, Oracle, MySQL, PostgreSQL, SQL Server, Sybase…
Limites du modèle relationnel • Structures de données limitées : • table → ensemble de n-uplets de valeurs atomiques (nombres, chaînes de caractères…) • Très bon support théorique mais Modèle « plat » • Difficile d ’exprimer des choses structurées (Première forme normale) • Difficile de naviguer dans la structure (Jointure) • Sémantique insuffisante
Insuffisance sémantique du modèle relationnel • BD décrivant un ensemble de personnes. • Chaque personne a : • un nom, • une liste de prénoms, • une date de naissance, • une adresse personnelle, • une adresse professionnelle, • des amis dont chacun est une personne • Une adresse est composée d'une rue, d'une ville et d'un code postale, • Un ami est une personne, • Un nom, un prénom, une rue, une ville et un code postal sont des chaînes de caractères. • L'âge d'une personne est égal à la date courante moins sa date de naissance.
Une solution : les approches objet • Adoption du modèle objet en BD deux approches : • Partir du modèle objet en programmation et rajouter les propriétés BD • Persistance, transactions, reprise, langage de requêtes • SGBD orienté objet • Partir du modèle relationnel et rajouter les propriétés objet • Structures complexes, identité, encapsulation, héritage, … • SGBD objet-relationnel
Propriété RICE du modèle objet • Réutilisation : • Héritage Multiple • Identité : • OID • Complexité : • Collections (SET, BAG, LIST, ARRAY) • Pointeurs REF et INVERSE • Encapsulation : • Attributs SET_VALUE et GET_VALUE • Méthodes
Le modèle objet pur • Alternative au SGBD relationnels • Nouveau modèle de données: ODMG • Nouveau langage de requête: OQL • ODMG : modèle de données pour SGBD orientés objet • Le correspondant du modèle relationnel • BD = ensemble de collections d'objets • Collection d'objets: correspond à une classe • Chaque objet a un identifiant (oid) unique • Classe: définit le schéma (interface) et la collection d'objets de cette classe (extent) • Attributs: atomiques ou composés (set, bag, list, array, struct) • Associations: références (ou ensembles de références) vers d'autres objets • Méthodes: fonctions applicables aux objets de la classe • Très proche du modèle conceptuel entité-association
Langage OQL • Langage déclaratif d ’interrogation : • Compatibilité avec l ’ordre SELECT de SQL-92 • Proposé par O2 Technology • Fonctionnalités générales : • tous les types ODMG et identité d ’objet • requête select … from … where … • polymorphisme de collections sources • imbrication de requêtes, requêtes nommées • appel d ’opérateurs et de méthodes • opérateurs ensemblistes (union, intersect, except) • opérateur universel (for all) • quantifieur existentialiste (exists) • order by, group by, fonctions d ’agrégat (count, sum, min, max, avg)
Le modèle relationnel objet • Extension des SGBD relationnels : • Ajout au relationnel des propriétés les plus utiles de l'objet • Basées sur des BD fiables et longuement optimisées ont gagné la "guerre de l'objet" contre les SGBD orientés objet • Principales extensions : • Possibilité de créer des types complexes et des tables de types complexes • Ajout des types LOB pour données texte, multimédia, etc. • Identifiants d'objet et types référence • Possibilité de définir des types abstraits et des méthodes sur ces types • Héritage entre types
Les Types Atomiques (SQL-92) • Build-In Type : • SQL-92 • DECIMAL, FLOAT, (NUMBER), … VARCHAR, DATE • LOB Long Object • CLOB (Character LOB) • BLOB (Binary LOB) : Chaîne d ’octets, le noyau du SGBD ne connaît pas la structure du BLOB • Usage : Stockage Multimédia (MPEG2, MP3, …) • BFILE • Stockage externe • SGF Multimédia (QoS, …)
Types Complexes • Types structurés : • ROW: n-uplet, ligne de table • ROW(nom1 type1, …, nomntypen) • Remarque: Oracle utilise le mot clé OBJECT • ARRAY: tableau de n'importe quel type • type ARRAY [taille] • Autres collections: MULTISET (utilisation: type MULTISET) • Remarque: dans Oracle on peut utiliser aussi TABLE OF type • Exemple : Acteurs et films CREATE TYPE Film AS OBJECT(titre VARCHAR(30), année INTEGER); CREATE TYPE FilmsActeur AS TABLE OF Film; CREATE TABLE Acteur(nom VARCHAR(20), pays VARCHAR(15), films FilmsActeur)
Création et manipulation des tables objet • Création des types et liens entre types (héritage, références) • Création des « corps » de types à travers la définition du contenu des méthodes déclarées • Création des tables à partir des types objet • Manipulation des données à travers un SQL étendu dans le sens de traitement des structures complexes (champs composés, tables imbriquées …)
Syntaxe de Création de types • CREATE [ OR REPLACE ] TYPE [ schema. ]type_name [ OID 'object_identifier' ] [ invoker_rights_clause ] { { IS | AS } OBJECT | UNDER [schema.]supertype } [ sqlj_object_type ] [ ( attributedatatype [ sqlj_object_type_attr ] [, attributedatatype [ sqlj_object_type_attr ]... [, element_spec [, element_spec ]... ] ) ] [ [ NOT ] FINAL ] [ [ NOT ] INSTANTIABLE ] ;
Cas pratique simpleEtape 1/3 • Création des types : • CREATE TYPE ADDRESS AS OBJECT ( street VARCHAR(60), city VARCHAR(30), state CHAR(2), zip_code CHAR(5) ) • CREATE TYPE PERSON AS OBJECT ( name VARCHAR(30), ssn NUMBER, addr ADDRESS ) • Le type person utilise le type address précédementcréé
Cas pratique simpleEtape 2/3 • Création des tables : • CREATE TABLE persons OF PERSON • Créationd’une table d’objets à partir d’un type • CREATE TABLE employees ( empnumber INTEGER PRIMARY KEY, person_data REF PERSON, manager REF PERSON, office_addr ADDRESS, salary NUMBER ) • La table employees et liée à la table persons. Les champs REF contiennent les OID des objetspointés
Cas pratique simpleEtape 3/3 • Manipulation des données : • Insertion : • INSERT INTO persons VALUES ( PERSON('Wolfgang Amadeus Mozart', 123456, ADDRESS('Am Berg 100', 'Salzburg', 'AT','10424'))) • INSERT INTO persons VALUES ( PERSON('Ludwig van Beethoven', 234567, ADDRESS('Rheinallee', 'Bonn', 'DE', '69234'))) • INSERT INTO employees (empnumber, office_addr, salary) VALUES ( 1001, ADDRESS('500 Oracle Parkway', 'RedwoodShores', 'CA', '94065'), 50000) • Mise à jour (Update) • UPDATE employees SET manager = (SELECT REF(p) FROM persons p WHERE p.name = 'Wolfgang Amadeus Mozart‘) • UPDATE employees SET person_data = (SELECT REF(p) FROM persons p WHERE p.name = 'Ludwig van Beethoven’)
Cas pratique élaboréEtape 1/3 • Création de type avec méthodes (spécification) : • SQL> createor replace type Address_Typeas object ( street_addr1 varchar2(25),street_addr2 varchar2(25),city varchar2(30),state varchar2(2),zip_codenumber,memberfunctiontoStringreturn varchar2,mapmemberfunctionmapping_functionreturn varchar2 10 )
Cas pratique élaboréEtape 2/3 • Création de type avec méthodes (corps) : • SQL> create or replace type body Address_Type asmemberfunctiontoString return varchar2isbegin if ( street_addr2 is not NULL ) then return street_addr1 || ' ' || street_addr2 || ' ' || city || ', ' || state || ' ' || zip_code;else return street_addr1 || ' ' || city || ', ' || state || ' ' || zip_code; end if; end;mapmemberfunctionmapping_function return varchar2isbegin return to_char( nvl(zip_code,0), 'fm00000' ) ||lpad( nvl(city,' '), 30 ) ||lpad( nvl(street_addr1,' '), 25 ) ||lpad( nvl(street_addr2,' '), 25 );end;end;
Cas pratique élaboréEtape 3/3 • Manipulation des données : • SQL> createtable people ( name varchar2(10),home_addressaddress_type,work_addressaddress_type)SQL> createor replace type Address_Array_Type as varray(25) of Address_TypeSQL> alter table people addprevious_addressesAddress_Array_Type SQL> set describedepth all SQL> desc people
Bases de données XML • XML est utilisé dans : • un contexte d'utilisation documentaire (OOO, word...) • échange de donnée, parfois complexes • Question légitime XML est-il un SGBD. Réponse : partiellement : • contient données, structures, langage de requête • Manque un stockage efficace, l’indexation, le transactionnel … • Réponse au besoin de stockage XML au niveau d’un SGBD : • Extension de BD relationnelles existantes (cas Oracle, Informix…), avec stockage interne/externe dans la base de données • BD dédiées à XML ou XML natives
XPATH • XPath Expressions • Une expression Xpathdésigne un modèleselonlesquelscertains “noeuds” XML sontextraits • Les noeudspeuventêtre de différents types : • Racine (Root) • Element • Texte • Attribut • Commentaire • Processing instruction • Espace de noms
XPATH – Exemple d’accès • On va illustrer les exemples d’accès XPATH à travers le fichier de données XML suivant : • <?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book> <title lang="eng">Harry Potter</title> <price>29.99</price></book><book> <title lang="eng">Learning XML</title> <price>39.95</price></book></bookstore>
XML Query (XQuery) • XQuery 1.0 est un language décrit par le W3C pour l’interrogation des données XML • Similaire au SQL • XQuerydéfinit un nouveau modèle de donnéesnommé :séquences: le résultat de chaque expression XQueryestune sequence • Les séquencesressemblent aux ensembles ramenézs par les requêtes SQL, maispeuventcontenir des doublons • UneSéquenceXqueryconsiste en des items atomiques (scalaires) ou des noeuds XML
Les expressions XQuery • Ce sont des expressions sensibles à la casse • Il peuvent inclure : • Des expressions primaires (littéraux, variables, fonctions …) • Une expression Xpath • L’expression FLOWR (for, let, where , order by, return) • Les séquencesXquery (par exemple(1, 2, (3, 4, (5), 6), 7)) qui peuvent être associées aux opérateurs union, intersect par exemple • Les constructions directes (<a>33</a> par exemple) • Les constructions XML dynamiques () : l’expression Xquery<foo>{attribute toto {2+3}, element bar {"tata", "titi"}, text {" why? "}</foo> construit la donnée XML <foototo="5"><bar>tatatiti</bar> why? </foo> • Les expressions conditionnelles • Les expressions arithmétiques ou logiques • Les expressions avec quantificateur (existentiel ou universel) : • every $foo in doc("bar.xml")//Whatever satisfies $foo/@bar > 42 • some $toto in (42, 5), $titi in ("xyz12", "abc", 5) satisfies $toto = $titi • Les expressions régulières
XQUERY – Exemple 1 • SELECT XMLQuery('for $i in ora:view("REGIONS"), $j in ora:view("COUNTRIES") where $i/ROW/REGION_ID = $j/ROW/REGION_ID and $i/ROW/REGION_NAME = "Asia" return $j' RETURNING CONTENT) AS asian_countries FROM DUAL; • ASIAN_COUNTRIES ROW> <COUNTRY_ID>AU</COUNTRY_ID> <COUNTRY_NAME>Australia</COUNTRY_NAME> <REGION_ID>3</REGION_ID> </ROW> <ROW> <COUNTRY_ID>CN</COUNTRY_ID> <COUNTRY_NAME>China</COUNTRY_NAME> <REGION_ID>3</REGION_ID> </ROW>
XQUERY – Exemple 2 • CONNECT HR/HR • GRANT SELECT ON LOCATIONS TO OE • CONNECT OE/OE • SELECT XMLQuery( 'for $i in ora:view("OE", "WAREHOUSES")/ROW return <Warehouse id="{$i/WAREHOUSE_ID}"> <Location> {for $j in ora:view("HR", "LOCATIONS")/ROW where $j/LOCATION_ID eq $i/LOCATION_ID return ($j/STREET_ADDRESS, $j/CITY, $j/STATE_PROVINCE)} </Location> </Warehouse>' RETURNING CONTENT) FROM DUAL;
XQUERY – Exemple 2 - Résultat XMLQUERY('FOR$IINORA:VIEW("OE","WAREHOUSES")/ROWRETURN<WAREHOUSEID="{$I/WAREHOUS -------------------------------------------------------------------------------- <Warehouse id="1"> <Location> <STREET_ADDRESS>2014 Jabberwocky Rd</STREET_ADDRESS> <CITY>Southlake</CITY> <STATE_PROVINCE>Texas</STATE_PROVINCE> </Location> </Warehouse> <Warehouse id="2"> <Location> <STREET_ADDRESS>2011 Interiors Blvd</STREET_ADDRESS> <CITY>South San Francisco</CITY> <STATE_PROVINCE>California</STATE_PROVINCE> </Location> </Warehouse>
XQUERY – Exemple 3 • SELECT * FROM XMLTable( 'for $i in ora:view("OE", "WAREHOUSES")/ROW return <Warehouse id="{$i/WAREHOUSE_ID}"> <Location> {for $j in ora:view("HR", "LOCATIONS")/ROW where $j/LOCATION_ID eq $i/LOCATION_ID return ($j/STREET_ADDRESS, $j/CITY, $j/STATE_PROVINCE)} </Location> </Warehouse>');
XQUERY – Exemple 3 - Résultat <Warehouse id="1"> <Location> <STREET_ADDRESS>2014 Jabberwocky Rd</STREET_ADDRESS> <CITY>Southlake</CITY> <STATE_PROVINCE>Texas</STATE_PROVINCE> </Location> </Warehouse> <Warehouse id="2"> <Location> <STREET_ADDRESS>2011 Interiors Blvd</STREET_ADDRESS> <CITY>South San Francisco</CITY> <STATE_PROVINCE>California</STATE_PROVINCE> </Location> </Warehouse>
XMLType • XMLTypeest un type abstrait pour la manipulation native des données XML dans la base de données • XMLTypeest un type objet possédant des méthodes pour créer, extraire et indexer les données XML de la base • XMLTypeoffre des possibilitésd’accès aux données XML à travers le langage SQL • La fonctionnalitéXMLTypeestaussiofferte à travers un ensemble d’APIs PLSQL ou Java
XMLType : Exemples 1/3 Create table some_xml_table of xmltype; insert intosome_xml_table values ( xmltype(' <things> <numbers><item>1</item><item>59</item></numbers> <animals><item>bird</item><item>cat</item><item>dog</item></animals> </things> ')); Set long 1000 select sxt.object_value.getClobVal() fromsome_xml_tablesxt;
XMLType : Exemples 2/3 CREATE TABLE xmltypetab OF XMLTYPE;CREATE TABLE shopping_cart(cart_idNUMBER,cart_data XMLTYPE, upd_date DATE); INSERT INTO xmltypetabVALUES('<?xml version="1.0" encoding="utf-8"?> <ShoppingCartDataxmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Id>Amazon.com</Id><SiteId>1</SiteId> <ProductId>100</ProductId> <Quantity>2</Quantity> </ShoppingCartData>');COMMIT;SELECT COUNT(*)FROM xmltypetabwhereexistsNode(object_value,'/ShoppingCartData/SiteId') = 1;
XMLType : Exemples 3/3 • CREATE TABLE xmldemo OF XMLType;create table some_things of xmltype;INSERT INTO xmldemoVALUES (XMLType('<things><numbers><item>1</item><item>59</item></numbers><animals> <item>bird</item> <item>cat</item> <item>dog</item> </animals> </things>'));INSERT INTO xmldemoVALUES (XMLType('<things><countries><item>Canada</item><item>Russia</item><item>Finland</item></countries><numbers> <item>42</item> <item>2012</item> </numbers> </things>'));INSERT INTO xmldemoVALUES (XMLType('<things><cities><item>Vancouver</item><item>St. Petersburg</item><item>Helsinki</item> </cities> <animals><item>mongoose</item><item>greygoose</item> </animals> </things>'));SELECT extract(object_value,'/things/animals/item[position()=2]') "2nd Animal » FROM xmldemo;
Sources • Cours de M. Jacques Lemaitre ( Université du Sud Toulon-Var) • Cours de Didier DONSEZ (Université Joseph Fourier - Grenoble 1) • Cours Dan VODISLAV (Université de Cergy-Pontoise) • Serge Miranda 97 • Cours miage université de nantes