Ma situation est la suivante:Quelle est la meilleure pratique pour définir un service de savon (opération générique vs opération spécifique)?
J'ai une base de données normalisée, dans laquelle je possède des informations géographiques sur les aéroports. La structure est:
airport --is in--> city --is in--> country --is in--> continent
Maintenant je veux laisser les utilisateurs administrer ces données, sans leur donner un accès direct à la base de données. Nous devons offrir cette interface d'administration via un service web. Maintenant, quand il s'agit de concevoir le service, nous sommes tombés sur la discussion sur la façon de définir les opérations. Nous sommes venus avec des solutions différentes:
Solution A: opérations spécifiques
Pour chacune des quatre tables (aéroport, ville, pays, continent), nous définissons 3 opérations:
- insert
- obtenir
- mise à jour
Cela aboutirait à 12 opérations avec 2 objets requête/réponse = 24 objets
Pour créer un tout nouvel aéroport avec toutes les dépendances, au moins 4 demandes seraient nécessaires.
Solution B: générique
Il n'y a qu'une seule opération, qui est contrôlé par les paramètres. Cette opération est capable de créer tout ce qui est nécessaire pour administrer la base de données.
L'opération détermine ce qui doit être fait et l'exécute. Si une erreur survient, elle va tout annuler.
==> 1 Fonctionnement = 2 objets de demande de réponse très complexe/
Solution C: Rendez-vous au milieu 1
Une opération générique par table, qui est capable d'exécuter obtenir, insérer , mise à jour, tout comme la solution B, mais concentrée sur une table chacun.
==> 4 opérations = 8 objets de demande de réponse complexe/
Solution D: Rendez-vous au milieu 2
Une opération générique par action (obtenir, insérer, supprimer), qui peut travailler sur chaque table et résoudre les dépendances.
==> 3 opérations = 6 légèrement plus complexe demande/réponse-objets
Exemple
Comme c'était plutôt abstraite, hier un exemple simplifié de la demande-objets pour créer (JFK/Nouveau York/Etats-Unis/Amérique du Nord):
Solution A:
Demande 1/4:
<insertContinent>North America</insertContinent>
Demande 2/4:
<insertCountry continent="North America">USA</insertCountry>
Demande 3/4:
<insertCity country="USA">New York</insertCity>
4/4 Demande:
<insertAirport city="New York">JFK</insertAirport>
Solution B:
Demande 1/1:
<action type="insertCountry" parent="North America">USA</action>
<action type="insertAirport" parent="New York">JFK</action>
<action type="insertContinent" parent="">North America</action>
<action type="insertCity" parent="USA">New York</action>
Solution C:
Demande 1/4:
<countryAction type="insert" parent="North America">USA</countryAction>
Demande 2/4:
<airportAction type="insert" parent="New York">JFK</airportAction>
Demande 3/4:
<continentAction type="insert" parent="">North America</continentAction >
4/4 Demande:
<cityAction type="insert" parent="USA">New York</cityAction >
Solution D: demande 1/1:
<insert airport="JFK" city="New York" country="USA" continent="North America" />
Solution D semble assez élégante pour moi, donc j'ai essayé de mettre ce dans XSD:
Code:
<complexType name="NewContinent">
<sequence>
<element name="NAME" type="string"></element>
</sequence>
</complexType>
<complexType name="NewCountry">
<sequence>
<element name="ISOCODE" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="newCONTINENT" type="tns:NewContinent"></element>
<element name="CONTINENT" type="string"></element>
</choice>
</sequence>
</complexType>
<complexType name="NewCity">
<sequence>
<element name="IATA" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="COUNTRY" type="string"></element>
<element name="newCOUNTRY" type="tns:NewCountry"></element>
</choice>
</sequence>
</complexType>
<complexType name="NewAirport">
<sequence>
<element name="IATA" type="string"></element>
<element name="NAME" type="string"></element>
<choice>
<element name="CITY" type="string"></element>
<element name="newCITY" type="tns:NewCity"></element>
</choice>
</sequence>
</complexType>
Une demande correspondante doit ressembler à suit:
<complexType name="Request">
<choice>
<element name="AIRPORT" type="tns:NewAirport"></element>
<element name="CITY" type="tns:NewCity"></element>
<element name="COUNTRY" type="tns:NewCountry"></element>
<element name="CONTINENT" type="tns:NewContinent"></element>
</choice>
</complexType>
Ma question: Est-ce vraiment la meilleure solution disponible? Le XSD est-il suffisant pour comprendre, que se passe-t-il?