Home » Articole » RO » Calculatoare » Dezvoltarea web » XML » Relația mulți-la-mulți în XML

Relația mulți-la-mulți în XML

postat în: XML 0

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

Model de date pentru o relație m:m 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:

  1. nodul care are cheia
  2. numele cheii
  3. 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:

  • Prelucrarea eficientă și flexibilă a datelor datorită separării structurii, conținutului și stilului.
  • Prelucrarea datelor independent de platformă.
  • Conversie fără pierderi în alte formate de fișiere.
  • Integrare ușoară în site-urile lor web.
  • Posibilitatea de a crea un magazin web propriu în design individual

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)

Ghid WordPress pentru dezvoltatori
Ghid WordPress pentru dezvoltatori

WordPress este o platformă pentru site-uri web rapidă, fiabilă, cu facilități multiple pentru dezvoltatori și ușor de utilizat. Totusi, dezvoltatorii și beneficiarii au de multe ori nevoie să adauge funcționalități suplimentare pentru a răspunde nevoilor lor. Acest ghid oferă unele … Citeşte mai mult

Nu a fost votat $3,99 Selectează opțiunile
Eseuri filosofice
Eseuri filosofice

O colecție personală de eseuri din filosofia științei (fizică, în special gravitație), filosofia tehnologiei informațiilor și comunicații, problemele sociale actuale (inteligența emoțională, pandemia COVID-19, eugenia, serviciile de informații), filosofia artei și logica și filosofia limbajului. Distincția dintre falsificare și respingere … Citeşte mai mult

Nu a fost votat $4,99$18,09 Selectează opțiunile
Tehnologia Blockchain - Bitcoin
Tehnologia Blockchain – Bitcoin

Internetul a schimbat complet lumea, cultura şi obiceiurile oamenilor. După o primă fază caracterizată prin transferul liber al informaţiilor, au apărut preocupările pentru siguranţa comunicaţiilor online şi confidenţialitatea utilizatorilor. Tehnologia blockchain asigură ambele aceste deziderate. Relativ nouă, ea are şansa să producă … Citeşte mai mult

Nu a fost votat $2,99$11,99 Selectează opțiunile

Lasă un răspuns

Adresa ta de email nu va fi publicată.