Les Bases de Données

PART   ----------------------------------------
| PNUM | PNAME | COLOR | WEIGHT | CITY |
|----------------------------------------|
 | P1 | Nut | Red | 12.0 | London |
| P2 | Bolt | Green | 17.0 | Paris |
| | | | | |

SHIPMENT -------------------
| SNUM | PNUM | QTY |
|-------------------|
| S1 | P1 | 100 |
| S1 | P2 | 200 |
| | | |

Le Web HTML et XML

Aperçu sur XML

<?xml version="1.0" encoding="utf-8"?>
<voeux genre="simple">
Bonne fête.
</voeux>

Développement de XML

Documents XML dans Base de Données

Exemple: Soit la relation
PART (PNUM, PNAME, COLOR, WEIGHT, CITY, IMAGE)
Document SVG, image d'une pièce, dans une relation PART dans une BD "Objet/relationnelle"

Attribut sous forme de document SVG

De façon similaire, on peut ajouter un attribut DESCRIPTION dans cette relation PART, par commentaire sous forme de document XML.

Base de Données dans Documents XML

Exemple: XML peut être utilisé pour stocker des relations
<?xml version="1.0"?>
<PartsRelation>
<PartTuple>
<PNUM>P1</PNUM>
<PNAME>Nut</PNAME>
<COLOR>Red</COLOR>
<WEIGHT>12.0</WEIGHT>
<CITY>London</CITY>
</PartTuple>

<PartTuple>
<PNUM>P2</PNUM>
<PNAME>Bolt</PNAME>
<COLOR>Green</COLOR>
<WEIGHT>17.0</WEIGHT>
<CITY>Paris</CITY>
</PartTuple>
...
</PartsRelation>

source

A noter:
<?xml version="1.0"?>
<PartsRelation>
<PartTuple CITY="London">
<PNUM>P1</PNUM>
<PNAME>Nut</PNAME>
<COLOR>Red</COLOR>
<WEIGHT>12.0</WEIGHT>
</PartTuple>

<PartTuple CITY="Paris">
<PNUM>P2</PNUM>
<PNAME>Bolt</PNAME>
<COLOR>Green</COLOR>
<WEIGHT>17.0</WEIGHT>
</PartTuple>
...
</PartsRelation>
source

Structure d'unDocument XML

Structure hiérarchique d'un document XML


XML et les stanards associès

Données Structurées vs Semi Structurées

Langage de Définition de XML

Document  Type Definition

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE ... >
<PartsRelation>

<NOTE>Revised version</NOTE>
<PartTuple CITY="London">
<PNUM>P1</PNUM>
<PNAME>Nut</PNAME>
<WEIGHT>12.0</WEIGHT>
<NOTE>Part color is Red by default</NOTE>
</PartTuple>

<PartTuple COLOR="Green" CITY="Paris">
<PNUM>P2</PNUM>
<PNAME>Bolt</PNAME>
<WEIGHT>17.0</WEIGHT>
</PartTuple>

<PartTuple CITY="Oslo" COLOR="Blue">
<PNUM>P3</PNUM>
<PNAME>Screw</PNAME>
<WEIGHT>17.0</WEIGHT>
</PartTuple>
</PartsRelation>
source
1  <!ELEMENT PartsRelation (NOTE?, PartTuple*)>
2 <!ELEMENT NOTE (#PCDATA)>
3 <!ELEMENT PartTuple (PNUM, PNAME, WEIGHT, NOTE?)>
4 <!ATTLIST PartTuple
5 CITY (London | Oslo | Paris) #REQUIRED
6 COLOR (Red | Green | Blue) "Red">
7 <!ELEMENT PNUM (#PCDATA)>
8 <!ELEMENT PNAME (#PCDATA)>
9 <!ELEMENT WEIGHT (#PCDATA)>
source

Document Bien Formé et Document Valide

Attributs de type ID et IDREF

1  <!ATTLIST SupplierTuple SNUM ID #REQUIRED>
2 <!ATTLIST PartTuple PNUM ID #REQUIRED>
3 <!ATTLIST ShipmentTuple SNUM IDREF #REQUIRED>
4 <!ATTLIST ShipmentTuple PNUM IDREF #REQUIRED>
sources PartRelation, ShipmentRelation.

Clé et Intégrité Référentielle

ID et IDREF ne représentent pas exactement les notions de clé et d'intégrité référentielle.

Limitations de DTDs

Autres limitations des DTDs

XML Schema

Exemple de Schema


<?xml version="1.0"?>
<!-- XML Schema schema for PartsRelation documents -->
<!DOCTYPE xsd:Schema SYSTEM "http://www.w3.org/2001/XMLSchema.dtd">
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="NOTE" type="xsd:string" />

<xsd:element name="PartsRelation"> <!-- Racine PartsRlations-->
<xsd:complexType> <!-- de type complexe -->
<xsd:sequence> <!-- séquence de -->
<xsd:element ref="NOTE" minOccurs="0" /> <!-- elmt NOTE optionel -->
<xsd:element name="PartTuple" type="PartTupleType"
minOccurs="0" maxOccurs="unbounded" />
<!-- 0 ou +r elmt PartTuple de type PartTupleType -->
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="PartTupleType"> <!-- Definiion du type PartTupleType -->

<xsd:sequence>
<xsd:element name="PNUM" type="PartNum" /> <!-- type utilisateur -->
<xsd:element name="PNAME" type="xsd:string" />
<xsd:element name="WEIGHT"> <!-- type de WEIGHT donné inline -->
<xsd:simpleType>
<xsd:restriction base="xsd:decimal"> <!-- ss-ens de decimal -->
<xsd:totalDigits value="5" />
<xsd:fractionDigits value="1" fixed="true" />
<xsd:minInclusive value="0.1" /> <!-- 0.1, 0.2, ... 9999.9 -->
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element ref="NOTE" minOccurs="0" />
</xsd:sequence>

<xsd:attribute name="CITY" type="City" /> <!-- autres types utilisateur -->

<xsd:attribute name="COLOR" type="Color" default="Red" />

</xsd:complexType>

<!-- définitions types utilisateur -->
<xsd:simpleType name="PartNum">
<xsd:restriction base="xsd:string">
<xsd:pattern value="P[0-9]{1,3}" /> <!-- valeurs définies par exp. régulière -->
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="Color">
<xsd:restriction base="xsd:string"> <!-- valeurs type Color énumérées -->
<xsd:enumeration value="Red" />
<xsd:enumeration value="Green" />
<xsd:enumeration value="Blue" />
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="City">
<xsd:restriction base="xsd:string"> <!-- valeurs type City énumérées -->
<xsd:enumeration value="London" />
<xsd:enumeration value="Oslo" />
<xsd:enumeration value="Paris" />
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

Source


Remarques:

XML Schema vs DTD


Un document XML Schemas donné ou une DTDs donnée,  sont en fait des définitions de langages (dérivés de XML) adaptés à un besoin particulier (avec des balises propres définies par l'utilisateur).

Langage de manipulation de XML

XPath

XPath (suite)


La notion de "courant"  qui implique une naviguation et une exécution contextuelle, rappelle les langauges des anciens systèmes (hiérarchiques). Que le modèle relationnel est venu corriger...

XQuery

<Result>
{ for $spx in document("ShipmentsRelation.xml")
//ShipmentTuple,
$sx in document("SuppliersRelation.xml")
//SupplierTuple[SNUM = $spx/SNUM],
$px in document("PartsRelation.xml")
//PartTuple[PNUM = $spx/PNUM]
order by SNAME, PNAME
return
<ResultTuple>
{ $sx/SNAME, $px/PNAME, $spx/QTY }
</ResultTuple> }
</Result>

Source

Boucles imbriquées et création de tuples composés de noeuds XPath.

XQuery (suite)

A noter:

XQuery (suite)

Examen à la loupe:

Forme FLOWR

 for  let  where  order  return
"Numéros de pièces et la qté totale pour les pièces fournies par plus d'un fournisseur"
for $pnum in distinct-values(document("ShipmentsRelation.xml")//PNUM)
let $spx := document("ShipmentsRelation.xml")
//ShipmentTuple[PNUM = $pnum]
where count ( $spx ) > 1
order by PNUM
return
<Result>
{ $pnum,
<totqty> { sum ( $spx/qty ) } </totqty> }
</Result>
Source
A noter:

XQuery, Autre Exemple

 Soit le document XML SupplierOverShipments conçu différemment d'une BD classique (1FN)

Autre Exemple

Le document PartsRelations restant le même. Soient les  requêtes

"Les fournisseurs qui fournissent P2" et "Les pièces fournies par S2"

for $sx in document("SuppliersOverShipments.xml")//Supplier
where $sx//PNUM = "P2"
return
<Result>
{ $sx//SNUM, $sx//SNAME, $sx//STATUS, $sx//CITY }
</Result>
let $sx := document("SuppliersOverShipments.xml")//Supplier[SNUM = "S2"]
return
<Result>
{ document("PartsRelation.xml")//PartTuple[PNUM = $sx//PNUM] }
</Result>

XML et les Bases de Données

Document Comme Valeur d'Attribut

Tout un document XML est mis comme valeur d'un attribut dans un tuple

Découper pour Stocker et Recomposer (Shred & Publish)

Différents morceaux du document comme  valeurs dans différents attributs
              publish
-------->
Tables XML
<--------
shred

Shred & Publish(suite)

XML views
Impedence Mismatch
Cas d'application

Base De Données XML

Tout  les documents dans une nouvelle "BD" XML

Annexe: Facilités SQL

SQL/XML en cours de standardisation. Supporte les deux approches "SQL Column" et "XML Collection"

Exemple-1:

CREATE TABLE P
( PNUM CHAR(6),
PNAME CHAR(20),
COLOR CHAR(6),
WEIGHT NUMERIC(5,1),
CITY CHAR(20)
 ) ;

Texte XML correspondant

XML Schema

Exemple-2:

INSERT INTO RESULT ( XMLCOL)
SELECT XMLGEN ( '<Result>
<SNAME>{SX.SNAME}</SNAME>
<PNAME>{PX.PNAME}</PNAME>
<QTY>{SPX.QTY}</QTY>
</Result>',
SX.SNAME, PX.PNAME, SPX.QTY ) AS Result
FROM S AS SX, P AS PX, SP AS SPX
WHERE SX.SNUM = SPX.SNUM
AND PX.PNUM = SPX.PNUM ;

UPDATE P
SET DRAWING = XMLFILETOCLOB ( 'BoltDrawing.svg' )
WHERE PNUM = 'P2' ;

SELECT XMLCONTENT ( DRAWING, 'RetrievedBoltDrawing.svg' )
FROM P
WHERE PNUM = 'P2' ;

UPDATE P
SET WEIGHT = XMLEXTRACTREAL
( 'PartsRelation.xml', '//PartTuple[PNUM = "P3"]/WEIGHT' )
WHERE PNUM = 'P3' ;

UPDATE SP
SET PARTDETAIL = XMLUPDATE
( PARTDETAIL, '//PartTuple/COLOR', 'Green' )
WHERE SNUM = 'S4' ;






Bibliographie