Deoarece XML oferă mijloacele de modelare a datelor folosind relații ierarhice părinte-copil, relațiile unu-la-unu și unu-la-mulți sunt relativ simplu de reprezentat în XML. Cu toate acestea, această structură ierarhică părinte-copil este dificil de utilizat pentru a modela relația multi-la-mulți, o relație comună între entități în multe situații.
Vom explora avantajele și dezavantajele câtorva metode care sunt utilizate pentru a modela o relație multi-la-mulți în XML; aceste metode oferă compromisuri în depășirea problemelor care apar la aplicarea acestei relații la XML. În special, vom vedea exemple despre cum să modelăm relația multi-la-mulți folosind două metode diferite, „Eliminare” și „ID/IDREF”. În plus, în foaia de stil XML, vom învăța cum să implementăm funcția cheie pentru a afișa datele care au fost modelate folosind metoda „ID/IDREF”.
Probleme: relația multi-la-mulți
În XML, relația părinte-copil este cel mai frecvent utilizată pentru a reprezenta o relație. Acest lucru poate fi aplicat cu ușurință unei relații unu-la-unu sau unu-la-mulți. O relație multi-la-mulți nu este suportată direct de XML; relația părinte-copil nu va funcționa deoarece fiecare element poate avea doar un singur element părinte. Există câteva soluții posibile pentru a ocoli acest lucru.
Soluții: relația multi-la-mulți
Eliminare
Creați documente XML care elimină necesitatea unei relații multi-la-mulți
Limitând amploarea informațiilor care sunt transmise, puteți ocoli nevoia unei relații multi-la-mulți. În loc să încercați ca un document XML să cuprindă toate informațiile, separați informațiile în cazul în care un document descrie doar una dintre entitățile care participă la relația multi-la-mulți. Folosind relația noastră tourGuide, de exemplu, o modalitate prin care putem realiza acest lucru ar fi crearea unui document XML separat pentru fiecare hotel. Relația cu amenitatea ar deveni în cele din urmă unu-la-mulți. Această metodă este mai potrivită pentru situațiile în care domeniul de aplicare al schimbului de date poate fi limitat la subseturi de date. Cu toate acestea, folosind această metodă pentru un schimb de date cu un domeniu mai larg, puteți repeta datele de mai multe ori, mai ales dacă există multe atribute. Pentru a evita această redundanță, utilizați metoda ID/IDREF.
ID/IDREF
Reprezentați relația multi-la-mulți folosind identificatori unici
Deși nu este cea mai simplă modalitate de a gestiona această problemă, o modalitate de a ocoli relația multi-la-mulți este prin crearea cheilor care ar identifica în mod unic fiecare entitate. Pentru a face acest lucru, în schema XML trebuie specificat un element cu tipuri de atribute ID sau IDREF. Pentru a utiliza o analogie de modelare a datelor, ID este similar cu cheia primară, iar IDREF este similar cu cheia externă.
Model de date de relație multi-la-mulți
Figura 1: Model de date pentru o relație m:m
Relația spune că un hotel poate avea multe facilități, iar o facilitate poate exista la multe hoteluri.
După cum veți observa, pentru a reprezenta o relație multi-la-mulți, au fost adăugate două entități. Entitatea de mijloc este necesară pentru ca modelul de date să reprezinte o entitate asociativă care stochează date despre relația dintre hotel și facilitate. Folosind exemplul nostru de ghid turistic, ”Facilitate” („Amenity”) a fost adăugat pentru a reprezenta o listă de posibile facilități pe care le poate avea un hotel.
Următoarele exemple ilustrează metode pentru a reprezenta o relație multi-la-mulți în XML.
Eliminare: soluție eșantion
În acest exemplu, relația multi-la-mulți a fost convertită într-o relație unu-la-mulți.
Schema XML
Figura 2: Schema XML pentru metoda „Eliminare”.
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Document : amenity1.xsd
Created on : February 4, 2006
Author : Dr. Rick Watson
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<xsd:element name="hotelGuide">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="hotel" type="hotelDetails" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="emailAddressType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="hotelDetails">
<xsd:sequence>
<xsd:element name="hotelPicture"/>
<xsd:element name="hotelName" type="xsd:string"/>
<xsd:element name="streetAddress" type="xsd:string"/>
<xsd:element name="postalCode" type="xsd:string" minOccurs="0"/>
<xsd:element name="telephoneNumber" type="xsd:string"/>
<xsd:element name="emailAddress" type="emailAddressType" minOccurs="0"/>
<xsd:element name="websiteURL" type="xsd:anyURI" minOccurs="0"/>
<xsd:element name="hotelRating" type="xsd:integer" default="0"/>
<xsd:element name="lowerPrice" type="xsd:positiveInteger"/>
<xsd:element name="upperPrice" type="xsd:positiveInteger"/>
<xsd:element name="amenity" type="amenityValue" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="amenityValue">
<xsd:sequence>
<xsd:element name="amenityType" type="xsd:string"/>
<xsd:element name="amenityOpenHour" type="xsd:time"/>
<xsd:element name="amenityCloseHour" type="xsd:time"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Document XML
Figura 3: Document XML pentru metoda „Eliminare”
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : amenity1.xml
Created on : February 4, 2006
Author : Dr. Rick Watson
-->
<hotelGuide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="amenity1.xsd">
<hotel>
<hotelPicture/>
<hotelName>Narembeen Hotel</hotelName>
<streetAddress>Churchill Street</streetAddress>
<telephoneNumber>+61 (08) 9064 7272</telephoneNumber>
<emailAddress>narempub@oz.com.au</emailAddress>
<hotelRating>1</hotelRating>
<lowerPrice>50</lowerPrice>
<upperPrice>100</upperPrice>
<amenity>
<amenityType>Restaurant</amenityType>
<amenityOpenHour>06:00:00</amenityOpenHour>
<amenityCloseHour>22:00:00 </amenityCloseHour>
</amenity>
<amenity>
<amenityType>Pool</amenityType>
<amenityOpenHour>06:00:00</amenityOpenHour>
<amenityCloseHour>18:00:00 </amenityCloseHour>
</amenity>
<amenity>
<amenityType>Complimentary Breakfast</amenityType>
<amenityOpenHour>07:00:00</amenityOpenHour>
<amenityCloseHour>10:00:00 </amenityCloseHour>
</amenity>
</hotel>
<hotel>
<hotelPicture/>
<hotelName>Narembeen Caravan Park</hotelName>
<streetAddress>Currall Street</streetAddress>
<telephoneNumber>+61 (08) 9064 7308</telephoneNumber>
<emailAddress>naremcaravan@oz.com.au</emailAddress>
<hotelRating>1</hotelRating>
<lowerPrice>20</lowerPrice>
<upperPrice>30</upperPrice>
<amenity>
<amenityType>Pool</amenityType>
<amenityOpenHour>10:00:00</amenityOpenHour>
<amenityCloseHour>22:00:00 </amenityCloseHour>
</amenity>
</hotel>
</hotelGuide>
ID/IDREF: soluție eșantion
Pentru a evita redundanța, creăm un element separat, „amenity”, care este inclus în partea de sus a schemei împreună cu „hotel”. Rețineți, tipurile de date ID și IDREF sunt sinonime cu cheia primară și, respectiv, cheia externă. Pentru fiecare cheie externă (IDREF), trebuie să existe o cheie primară (ID) corespunzătoare. Rețineți că tipul de date IDREF trebuie să fie un șir alfanumeric.
Următorul exemplu ilustrează abordarea ID/IDREF. Observați că ID-ul grupului de facilități este definit ca „k1”, iar fiecare hotel cu o piscină ca facilități face referire la „k1”, folosind IDREF. Dacă IDREF nu se potrivește cu niciun ID, atunci documentul nu se va valida.
Schema XML
Figura 4: Schema XML pentru metoda „ID/IDREF”.
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Document : amenity2.xsd
Created on : February 4, 2006
Author : Dr. Rick Watson
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<xsd:element name="hotelGuide">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="hotel" type="hotelDetails" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="amenity" type="amenityList" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="emailAddressType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="hotelDetails">
<xsd:sequence>
<xsd:element name="hotelPicture"/>
<xsd:element name="hotelName" type="xsd:string"/>
<xsd:element name="streetAddress" type="xsd:string"/>
<xsd:element name="postalCode" type="xsd:string" minOccurs="0"/>
<xsd:element name="telephoneNumber" type="xsd:string"/>
<xsd:element name="emailAddress" type="emailAddressType" minOccurs="0"/>
<xsd:element name="websiteURL" type="xsd:anyURI" minOccurs="0"/>
<xsd:element name="hotelRating" type="xsd:integer" default="0"/>
<xsd:element name="lowerPrice" type="xsd:positiveInteger"/>
<xsd:element name="upperPrice" type="xsd:positiveInteger"/>
<xsd:element name="amenities" type="amenityDesc" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="amenityDesc">
<xsd:sequence>
<xsd:element name="amenityIDREF" type="xsd:IDREF"/>
<xsd:element name="amenityOpenHour" type="xsd:time"/>
<xsd:element name="amenityCloseHour" type="xsd:time"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="amenityList">
<xsd:sequence>
<xsd:element name="amenityID" type="xsd:ID"/>
<xsd:element name="amenityType" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Document XML
Figura 5: Document XML pentru metoda „ID/IDREF”
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : amenity2.xml
Created on : February 4, 2006
Author : Dr. Rick Watson
-->
<?xml-stylesheet href="amenity2.xsl" type="text/xsl" media="screen"?>
<hotelGuide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="amenity2.xsd">
<hotel>
<hotelPicture/>
<hotelName>Narembeen Hotel</hotelName>
<streetAddress>Churchill Street</streetAddress>
<telephoneNumber>+61 (08) 9064 7272</telephoneNumber>
<emailAddress>narempub@oz.com.au</emailAddress>
<hotelRating>1</hotelRating>
<lowerPrice>50</lowerPrice>
<upperPrice>100</upperPrice>
<amenities>
<amenityIDREF>k2</amenityIDREF>
<amenityOpenHour>06:00:00</amenityOpenHour>
<amenityCloseHour>22:00:00 </amenityCloseHour>
</amenities>
<amenities>
<amenityIDREF>k1</amenityIDREF>
<amenityOpenHour>06:00:00</amenityOpenHour>
<amenityCloseHour>18:00:00 </amenityCloseHour>
</amenities>
<amenities>
<amenityIDREF>k5</amenityIDREF>
<amenityOpenHour>07:00:00</amenityOpenHour>
<amenityCloseHour>10:00:00 </amenityCloseHour>
</amenities>
</hotel>
<hotel>
<hotelPicture/>
<hotelName>Narembeen Caravan Park</hotelName>
<streetAddress>Currall Street</streetAddress>
<telephoneNumber>+61 (08) 9064 7308</telephoneNumber>
<emailAddress>naremcaravan@oz.com.au</emailAddress>
<hotelRating>1</hotelRating>
<lowerPrice>20</lowerPrice>
<upperPrice>30</upperPrice>
<amenities>
<amenityIDREF>k1</amenityIDREF>
<amenityOpenHour>10:00:00</amenityOpenHour>
<amenityCloseHour>22:00:00 </amenityCloseHour>
</amenities>
</hotel>
<amenity>
<amenityID>k1</amenityID>
<amenityType>Pool</amenityType>
</amenity>
<amenity>
<amenityID>k2</amenityID>
<amenityType>Restaurant</amenityType>
</amenity>
<amenity>
<amenityID>k3</amenityID>
<amenityType>Fitness room</amenityType>
</amenity>
<amenity>
<amenityID>k4</amenityID>
<amenityType>Complimentary breakfast</amenityType>
</amenity>
<amenity>
<amenityID>k5</amenityID>
<amenityType>in-room data port</amenityType>
</amenity>
<amenity>
<amenityID>k6</amenityID>
<amenityType>Water slide</amenityType>
</amenity>
</hotelGuide>
Funcția cheie: foaie de stil XML
Pentru a configura o foaie de stil XML folosind metoda ID/IDREF pentru o relație multi-la-mulți, trebuie utilizată funcția cheie. În foaia de stil, elementul <xsl:key> specifică indexul, care este folosit pentru a returna un set de noduri din documentul XML.
O cheie constă din următoarele:
- nodul care are cheia
- numele cheii
- valoarea unei chei
Următoarea foaie de stil XML ilustrează cum să utilizați funcția cheie pentru a prezenta conținut care este structurat într-o relație multi-la-mulți.
Foaia de stil XML
Figura 6: Foaia de stil XML pentru metoda „ID/IDREF”.
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : amenity2.xsl
Created on : February 4, 2006
Author : Dr. Rick Watson
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="amList" match="amenity" use="amenityID"/>
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head>
<title>Hotel Guide</title>
</head>
<body>
<h2>Hotels</h2>
<xsl:apply-templates select="hotelGuide"/>
</body>
</html>
</xsl:template>
<xsl:template match="hotelGuide">
<xsl:for-each select="hotel">
<xsl:value-of select="hotelName"/>
<br/>
<xsl:for-each select="amenities">
<xsl:value-of select="key('amList',amenityIDREF)/amenityType"/>
<xsl:text> </xsl:text>
<xsl:value-of select="amenityOpenHour"/> -
<xsl:value-of select="amenityCloseHour"/>
<BR/>
</xsl:for-each>
<br/>
<br/>
</xsl:for-each>
<br/>
</xsl:template>
</xsl:stylesheet>
Expedia.de: XML și marketing afiliat
Expedia.de este filiala germană a expedia.com, agenția de turism pe internet cu sediul în Bellevue, Washington, SUA. Oferă clienților săi rezervarea de bilete de avion, închirieri de mașini, pachete de vacanță și diverse alte atracții și servicii prin intermediul site-ului său web și prin telefon. Site-urile sale web atrag peste 70 de milioane de vizitatori în fiecare lună. În prezent, expedia.com are 4.600 de angajați care deservesc clienții din Statele Unite, Canada, Marea Britanie, Franța, Germania, Italia și Australia.În scopuri de marketing, expedia.de a creat un program de marketing afiliat. Marketingul afiliat este o modalitate de a ajunge la potențiali clienți fără niciun risc financiar pentru compania care intenționează să facă publicitate (comerciant). Comerciantul oferă proprietarilor de site-uri web, care sunt numiți afiliați, posibilitatea de a se referi la pagina comerciantului, oferind recompense bănești pe bază de comisioane ca stimulente. În cazul Expedia.de, partenerii afiliați primesc un comision de fiecare dată când utilizatorii de pe site-urile lor rezervă călătorii pe expedia.de. Astfel, afiliații se pot concentra pe vânzare, iar comerciantul se ocupă de gestionarea tranzacțiilor.
Pentru a ușura afacerea partenerilor afiliați – și, desigur, pentru a face programul mai atractiv – Expedia.de oferă partenerilor săi un serviciu numit xmlAdEd. xmlAdEd este un serviciu care oferă informații actuale despre produse despre utilizarea XML. Afiliații care utilizează acest serviciu pot solicita peste 8 milioane de oferte de călătorie în format XML prin solicitare HTTP. Datele sunt actualizate de mai multe ori pe zi. În solicitarea HTTP puteți seta anumiți parametri, cum ar fi locația, prețul, codul aeroportului, … Utilizarea XML în acest caz oferă afiliaților mai multe avantaje:
Prin furnizarea afiliaților lor de informații despre produse în XML, expedia.de nu numai că facilitează afacerile partenerilor lor, dar se asigură și că clienții primesc informații consistente și actualizate despre serviciile lor. |
Rezumar
Când descrieți o relație multi-la-mulți în XML, există câteva soluții disponibile pe care designerii le pot utiliza. În alegerea modului de reprezentare a relației multi-la-mulți, designerul nu trebuie să ia în considerare doar modul cel mai eficient de a reprezenta informația, ci și publicul căruia îi este destinat documentul și modul în care va fi utilizat documentul. |
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns