Arborescence données xml carburant
pdv_liste
id – latitude – longitude – cp - pop
pdv
services adresse ville horaires prix rupture fermeture
automatte-24-24 nom - id – maj - valeur id – nom – debut - fin type – debut – fin
TEXTE TEXTE
service
jour
id – nom - ferme
TEXTE
horaire
ouverture - fermeture
Validation par fichier DTD
• Eléments : <!ELEMENT>
• Eléments « Nœuds » contenants d’autres éléments (sous-éléments1, sous-élément2…)
• Occurrence des sous-éléments
• Eléments vides : EMPTY (element) = 1 occurrence
(element*) = 0 ou plus
• Eléments contenant du texte (parsed data) : PCDATA (element+) = au moins 1
(element?) = 0 ou 1
(element1|element2) = l’un ou l’autre
(element1|element2)* = 0 ou plus pour ces éléments
• Attributs : <!ATTLIST>
• CDDATA -> Type de donnée des attributs
• Contraintes : #REQUIRED , #IMPLIED …
Voir [Link]
<!ELEMENT pdv_liste (pdv*)> <!ELEMENT prix EMPTY>
<!ELEMENT pdv (adresse, ville, horaires, services, rupture*, prix*, fermeture* )> <!ATTLIST prix
<!ATTLIST pdv nom CDATA #IMPLIED
id CDATA #REQUIRED id CDATA #IMPLIED
latitude CDATA #REQUIRED maj CDATA #IMPLIED
longitude CDATA #REQUIRED valeur CDATA #IMPLIED>
cp CDATA #REQUIRED <!ELEMENT rupture EMPTY>
pop (A|R|N) #REQUIRED> <!ATTLIST rupture
<!ELEMENT adresse (#PCDATA)> nom CDATA #IMPLIED
<!ELEMENT ville (#PCDATA)> id CDATA #IMPLIED
<!ELEMENT horaires (jour*)> debut CDATA #IMPLIED
<!ATTLIST horaires automate-24-24 CDATA #REQUIRED> fin CDATA #IMPLIED>
<!ELEMENT jour (horaire*)> <!ELEMENT fermeture EMPTY>
<!ATTLIST jour <!ATTLIST fermeture
id CDATA #REQUIRED type CDATA #IMPLIED
nom CDATA #REQUIRED debut CDATA #IMPLIED
ferme CDATA #REQUIRED> fin CDATA #IMPLIED >
<!ELEMENT horaire EMPTY>
<!ATTLIST horaire
ouverture CDATA #REQUIRED
fermeture CDATA #REQUIRED>
<!ELEMENT services (service*)>
<!ELEMENT service (#PCDATA)>
Validation par fichier XSD
⇒TYPAGE des données
• Les balises complexType désignent des éléments contenant d’autres éléments ou des attributs :
<xs:complexType>
<xs:attribute name=“…” type=“…” > </xs:attribute>
<xs:sequence>
<xs:element name=“…” type=“…” ></xs:element>
</xs:sequence>
</xs:complexType>
• Les balises simpleType ne contiennent pas d’éléments elles peuvent être utilisées pour définir des
types de données personnalisés
<xs:simpleType></xs:simpleType>
Contraintes : <xs:restrictions>; <xs:pattern>…
Voir [Link]
<?xml version="1.0"?>
<xs:schema xmlns:xs="[Link]
(…)
</xs:schema>
La mention de l’espace de nom "[Link] permet de référencer les types de
données XSD prédéfinis tels que les types string, integer, boolean, float…etc. (pas de type char)
Exemple de construction du XSD :
L’élément racine est défini comme un élément <xs:element …> avec un name et un type
Les sous-éléments sont définis comme des types complexe <xs:complexType…>
Que ce soit pour les fichiers DTD ou XSD, l’ordre des instructions n’a pas d’importance
Exemple : DTD vs XSD
<xs:complexType name="pdvType">
<xs:sequence>
<xs:element name="adresse" type="xs:string"/>
<xs:element name="ville" type="xs:string"/>
<xs:element name="horaires" type="horairesType" />
<xs:element name="services" type="servicesType" />
<xs:choice minOccurs="0« maxOccurs="unbounded">
<xs:element name="prix" type="prixType"/>
<!ELEMENT pdv (adresse, ville, horaires, services, (rupture | prix | fermeture)* )>
<!ATTLIST pdv <xs:element name="rupture" type="ruptureType"/>
id CDATA #REQUIRED <xs:element name="fermeture" type="fermetureType"/>
latitude CDATA #REQUIRED
longitude CDATA #REQUIRED </xs:choice>
cp CDATA #REQUIRED </xs:sequence>
pop (A|N|R) #REQUIRED>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="latitude" type="floatOrEmpty" use="required"/>
<xs:attribute name="longitude" type="floatOrEmpty" use="required"/>
<xs:attribute name="cp" type="postalCode" use="required"/>
<xs:attribute name="pop" type="pop" use="required"/>
</xs:complexType>
Types de données personnalisés
Le type pop peut prendre comme valeur les Le type postalCode peut prendre comme Le type floatOrEmpty peut être
caractères suivants : ‘A’, ‘R’ ou ‘N’ valeur le pattern suivant : 5 chiffres un float ou une string vide
<xs:simpleType name="pop"> <xs:simpleType name="postalCode"> <xs:simpleType name="floatOrEmpty">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string"> <xs:union>
<xs:enumeration value="A"/> <xs:pattern value="[0-9]{5}"/> <xs:simpleType>
<xs:enumeration value="R"/> </xs:restriction> <xs:restriction base="xs:float"/>
<xs:enumeration value="N"/> </xs:simpleType> </xs:simpleType>
</xs:restriction> <xs:simpleType>
</xs:simpleType> <xs:restriction base="xs:string">
<xs:maxLength value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
Modèle conceptuel UML
Création d’entités : nom + attributs avec leur type
Cardinalité / multiplicité : Indique combien d'objets de l’entité peuvent être associés à un
seul objet de l'autre entité. Par exemple, une multiplicité de 1 du côté de la StationService
et * du côté des Prix des Carburants signifie qu'une station peut avoir plusieurs prix de
carburant, mais chaque prix de carburant est associé à une seule station.
Nom de l’association : sert à clarifier le sens de la relation entre les classes. Par
convention on utiliser un verbe.
Modèle conceptuel UML
ServiceStation
Station
Prix id : integer
1 latitude : float * Service
* id : integer * < fixe des
longitude : float * *
nom : string cp : string id : integer
propose des nom : string
maj : Date pop : char
Produit 1
valeur : float 1 adresse : string
ville : string
id : integer automate24-24 : string
Rupture
nom : string
1 1
1 id : integer
nom : string *
* debut : Date
fin : Date
0..14 Horaire
Fermeture *
ou *
id : integer id : integer
type : string jour : string
debut : Date ferme : string
fin : Date ouverture : string
fermeture : string
Horaires Jour Horaire
0..1 0..1 0..7 0..1 0..2
id : integer id : integer
id : integer
nom : string ouverture : Time
Automate24-24 : string
ferme : Date fermeture : Time
Fusion des entités en une seule table,
possible car associations de type 1:N
Horaires
id : integer
Automate24-24 : string
jour : string
ferme : string
ouverture : string
fermeture : string
Modèle logique / relationnel
Les entités deviennent des tables
Les associations sont traduites en clés étrangères (s’aider des cardinalités) et sont
modélisées par une flèche. Le sens de la flèche se note de la table qui possède une clé
étrangère vers la table à laquelle elle fait référence.
Modèle logique / relationnel
Station
Prix
id : integer
id : integer
maj : Date
latitude : float * ServiceStation Service
longitude : float
valeur : float cp : string stationId : integer id : integer
stationId : integer pop : char serviceId : integer nom : string
produitId : integer adresse : string
Produit ville : string
automate24-24 : string
id : integer
nom : string Rupture
debut : Date
fin : Date
stationId : integer
produitId : integer
Horaire
Fermeture id : integer
id : integer jour : string
type : string ferme : string
debut : Date ouverture : string
fin : Date fermeture : string
stationId : integer stationId : integer
Création tables SQL
Création des tables : Il faut créer les tables dans un ordre qui permet de résoudre toutes les dépendances de clé étrangères pour éviter les erreurs lors de
l’insertion de données dans les tables.
On créé dans un premier temps toutes les tables qui n’ont pas de clés étrangères. Ensuite, pour chaque table qui vient d’être créé, on identifie toutes les tables qui
ont une clé étrangère qui référence cette table et on les créées à leur tour.
CREATE TABLE IF NOT EXISTS [nom_table] : IF NOT EXISTS est optionnel -> permet de vérifier si la table existe déjà avant de la créer et permet éviter la génération
d’erreur à l’exécution du script SQL
Suppression des tables : Même principe à appliquer pour l’ordre de suppression
DROP TABLE IF EXISTS [nom_table]
Déclaration des clés primaires:
- Avec 1 attribut :
[nom_attribut] [type] NOT NULL PRIMARY KEY
- Avec plusieurs attribus :
[nom_attribut1] [type] NOT NULL
[nom_attribut2] [type] NOT NULL
PRIMARY KEY ([nom_attribut1], [nom_attribut2])
La clé primaire d’une table est dans de nombreux cas un identifiant de type entier.
Lorsque les identifiants ne sont pas connus à l’avance et que leur génération ne présente pas de contraintes particulières,
on peut de laisser le SGBD les générer pour nous, en particulier lorsque de nombreuses lignes doivent être insérées dans la table :
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT permet de générer automatiquement un identifiant unique
Déclaration de clés étrangères : FOREIGN KEY ( [nom_attribute] ) REFERENCES [nom_table_ref]( [nom_cléP_table_ref] )
Exemple : création des tables Station, Service et ServiceStation
CREATE TABLE Station (
id INT NOT NULL PRIMARY KEY,
Remarques :
addresse VARHCAR(200) NOT NULL,
ville VARCHAR(50) NOT NULL,
l’utilisation type de donnée POINT permet de représenter des données spatiales,
cp CHAR(5) NOT NULL,
L’attribut position sera construit en récupérant la latitude et la longitude renseignées dans les
position POINT,
données xml. Il faudra les diviser par 100000 pour obtenir les coordonnées GeoDecimal
automate TINYINT(1) NOT NULL,
Voir [Link]
pop ENUM('A','R','N') NOT NULL
);
Le type TINYINT(1) est utilisé en mySQL pour représenter des valeurs booléennes stockée sur 1bit.
Voir [Link]
CREATE TABLE Service(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(250) NOT NULL
);
CREATE TABLE ServiceStation( CREATE TABLE ServiceStation(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, => stationId INT NOT NULL,
stationId INT NOT NULL, Utiliser les attributs serviceId INT NOT NULL,
serviceId INT NOT NULL, PRIMARY KEY(stationId,serviceId),
existants pour déclarer la clé
FOREIGN KEY (stationId) REFERENCES Station(id), FOREIGN KEY (stationId) REFERENCES Station(id),
primaire
FOREIGN KEY (serviceId) REFERENCES Service(id) FOREIGN KEY (serviceId) REFERENCES Service(id)
); );
id stationId serviceId stationId serviceId
1 1000001 2 1000001 2
2 1000001 3 1000001 3
3 1000002 1 1000002 1
4 1000003 1 1000003 1
5 1000003 2 1000003 2
Person Job Company
id name companyId personId salary id name name companies
0 Alice 0 0 25000 0 SuperTruc Alice SuperTruc
1 Bob 0 1 22000 0 SuperTruc
Bob SuperTruc, TrucTruc
1 Bob 1 1 5000 1 TrucTruc
Charlie TrucTruc
2 Charlie 1 2 35000 1 TrucTruc