Cours Bases de données avancées

Download Report

Transcript Cours Bases de données avancées

Najib OURADI-Insea
2013-2014

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…

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



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.


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

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

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 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)

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

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 structurés :
 ROW: n-uplet, ligne de table
 ROW(nom1 type1, …, nomn typen)
▪ 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)
1.
2.
3.
4.
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 …)
CREATE [ OR REPLACE ]
TYPE [ schema. ]type_name
[ OID 'object_identifier' ]
[ invoker_rights_clause ]
{ { IS | AS } OBJECT
| UNDER [schema.]supertype }
[ sqlj_object_type ] [ ( attribute datatype [
sqlj_object_type_attr ] [, attribute datatype [
sqlj_object_type_attr ]... [, element_spec [,
element_spec ]... ] ) ]
[ [ NOT ] FINAL ]
[ [ NOT ] INSTANTIABLE ] ;


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édement
créé

Création des tables :
 CREATE TABLE persons OF PERSON
▪ Création d’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 objets pointés

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', 'Redwood Shores', '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’)

Création de type avec méthodes (spécification) :
 SQL> create or replace type Address_Type
as object
( street_addr1 varchar2(25),
street_addr2 varchar2(25),
city
varchar2(30),
state
varchar2(2),
zip_code number,
member function toString return varchar2,
map member function mapping_function return varc
har2
10 )

Création de type avec méthodes (corps) :

SQL> create or replace type body Address_Type as
member function toString return varchar2
is
begin
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;
map member function mapping_function return varchar2
is
begin
return to_char( nvl(zip_code,0), 'fm00000' ) ||
lpad( nvl(city,' '), 30 ) ||
lpad( nvl(street_addr1,' '), 25 ) ||
lpad( nvl(street_addr2,' '), 25 );
end;
end;


Manipulation des données :
SQL> create table people
( name
varchar2(10),
home_address address_type,
work_address address_type)
SQL> create or replace type Address_Array_Type as varray(25)
of Address_Type
SQL> alter table people add previous_addresses Address_Array_
Type
SQL> set describe depth all
SQL> desc people

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 Expressions
Une expression Xpath désigne un modèle selon
lesquels certains “noeuds” XML sont extraits
Les noeuds peuvent être de différents types :







Racine (Root)
Element
Texte
Attribut
Commentaire
Processing instruction
Espace de noms

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>
Expression
Description
Nom du nœud
Sélectionne tous les noeuds avec le nom indiqué
/
Selection à partir du noeud racine
//
Sélectionne des noeuds dans le document correspondant à la sélection,
là où ils se trouvent, et ce à partir du noeud courant
.
Sélectionne le nœud courant
..
Sélectionne le parent du noeud courant
@
Sélectionne des attributs
Path Expression
Result
bookstore
Sélectionne les noeuds avec le nom "bookstore"
/bookstore
Sélectionne l’élément racine pour le noeud bookstore
bookstore/book
Slélectionne les éléments book qui sont enfants de l’élément
bookstore
//book
Sélectionne tous les éléments book elements là où ils se trouvent dans
le document
//@lang
Sélectionne tous les attributs qui sont nommés lang
XQuery 1.0 est un language décrit par le W3C
pour l’interrogation des données XML
 Similaire au SQL
 XQuery définit un nouveau modèle de données
nommé :séquences: le résultat de chaque
expression XQuery est une sequence
 Les séquences ressemblent aux ensembles
ramenézs par les requêtes SQL, mais peuvent
contenir des doublons
 Une Séquence Xquery consiste en des items
atomiques (scalaires) ou des noeuds XML



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équences Xquery (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 <foo toto="5"><bar>tata titi</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

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>




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;
XMLQUERY('FOR$IINORA:VIEW("OE","WAREHOUSES")/ROWRET
URN<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>

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>');
<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 est un type abstrait pour la
manipulation native des données XML dans la
base de données
XMLType est un type objet possédant des
méthodes pour créer, extraire et indexer les
données XML de la base
XMLType offre des possibilités d’accès aux
données XML à travers le langage SQL
La fonctionnalité XMLType est aussi offerte à
travers un ensemble d’APIs PLSQL ou Java
Méthode
Description
Extract
A partir d’une colonne XML, et d’un chemin Xpath d’accès,
retourne un objet de type XMLType
ExistsNode
A partir d’une colonne XML, et d’un chemin Xpath d’accès,
retourne 0 ou 1 selon le nombre de nœuds retounés
XMLType
Constructeur, retourne une instance de type XMLType
GetBlobVal
Retourne le contenu d’une colonne XML sous forme d’un
BLOLB
GetClobVal
Retourne le contenu d’une colonne XML sous forme d’un
CLOLB
GetStringVal
Retourne le contenu d’une colonne XML sous forme d’une
chaine de caractères (String)
GetNumberVal
Retourne le contenu d’une colonne XML sous forme d’un
nombre
Create table some_xml_table of xmltype;
insert into some_xml_table values (
xmltype(' <things>
<numbers><item>1</item><item>59</item>
</numbers>
<animals><item>bird</item><item>cat</ite
m><item>dog</item></animals> </things>
'));
Set long 1000
select sxt.object_value.getClobVal() from
some_xml_table sxt;
CREATE TABLE xmltypetab OF XMLTYPE;
CREATE TABLE shopping_cart (cart_id NUMBER,cart_data XMLTYPE, upd_date DATE);
INSERT INTO xmltypetab
VALUES
('<?xml version="1.0" encoding="utf-8"?>
<ShoppingCartData xmlns: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 xmltypetab
where existsNode(object_value,'/ShoppingCartData/SiteId') = 1;

CREATE TABLE xmldemo OF XMLType;
create table some_things of xmltype;
INSERT INTO xmldemo VALUES
(XMLType('<things><numbers><item>1</item><item>59</item></numbers><animals>
<item>bird</item>
<item>cat</item>
<item>dog</item>
</animals>
</things>'));
INSERT INTO xmldemo VALUES
(XMLType('<things><countries><item>Canada</item><item>Russia</item><item>Finland</item
></countries><numbers> <item>42</item> <item>2012</item> </numbers> </things>'));
INSERT INTO xmldemo VALUES (XMLType('<things><cities><item>Vancouver</item><item>St.
Petersburg</item><item>Helsinki</item>
</cities> <animals><item>mongoose</item><item>grey goose</item> </animals> </things>'));
SELECT extract(object_value,'/things/animals/item[position()=2]') "2nd Animal » FROM
xmldemo;





Cours de M. Jacques Lemaitre ( Université
du Sud Toulon-Var)
Cours de Didier DONSEZ (Université Joseph
Fourier - Grenoble 1)
Cours Dan VODISLAV (Université de CergyPontoise)
Serge Miranda 97
Cours miage université de nantes