Mi situación es la siguiente:¿Cuál es la mejor práctica para definir un servicio de jabón (operación genérica o específica)?
Tengo una base de datos normalizada, en la que tengo información geográfica sobre los aeropuertos. La estructura es:
airport --is in--> city --is in--> country --is in--> continent
Ahora quiero que los usuarios administren estos datos, sin darles acceso directo a la base de datos. Necesitamos ofrecer esta interfaz de administración a través de un servicio web.
Ahora, cuando se trata de diseñar el servicio, nos encontramos con la discusión sobre cómo definir las operaciones. Se nos ocurrió con diferentes soluciones:
Solución A: operaciones específicas
Para cada una de las cuatro mesas (aeropuerto, ciudad, país, continente) definimos 3 operaciones:
- de inserción
- obtener
- actualización
Esto daría lugar a 12 operaciones con 2 objetos de solicitud/respuesta = 24 objetos
Para crear un aeropuerto nuevo con todas las dependencias, se necesitarían al menos 4 solicitudes.
Solución B: genérico
Hay solamente una operación, que se controla a través de parámetros. Esta operación puede crear todo lo necesario para administrar la base de datos.
La operación decidiría qué debe hacerse y lo ejecutará. Si se produce un error, revertirá todo.
==> 1 Operación = 2 petición altamente complejo/respuesta-objetos
Solución C: encontrarse en el medio 1
Una operación genérica por mesa, que es capaz de ejecutar obtener, insertar , actualizar, al igual que la solución B, pero se centró en una tabla cada uno.
==> 4 = 8 operaciones complejas petición/respuesta de objetos
Solución D: encontrarse en el medio 2
Una operación genérica por acción (obtener, insertar, eliminar), que puede trabajar en cada tabla y resolver dependencias.
==> 3 operaciones = 6 solicitud ligeramente más complejo/respuesta-objetos
Ejemplo
Dado que esta era bastante abstracto, hier un ejemplo simplificado para la solicitud de objetos para la creación (JFK/New York/EE.UU./América del Norte):
Solución A:
Solicitud 1/4:
<insertContinent>North America</insertContinent>
Solicitud 2/4:
<insertCountry continent="North America">USA</insertCountry>
Solicitud 3/4:
<insertCity country="USA">New York</insertCity>
Solicitud 4/4:
<insertAirport city="New York">JFK</insertAirport>
Solución B:
Solicitud 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>
Solución C:
Solicitud 1/4:
<countryAction type="insert" parent="North America">USA</countryAction>
Solicitud 2/4:
<airportAction type="insert" parent="New York">JFK</airportAction>
Solicitud 3/4:
<continentAction type="insert" parent="">North America</continentAction >
Solicitud 4/4:
<cityAction type="insert" parent="USA">New York</cityAction >
Solución D: Solicitud 1/1:
<insert airport="JFK" city="New York" country="USA" continent="North America" />
Solución D parece bastante elegante para mí, por lo tanto, trató de poner esto en XSD:
Código:
<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>
Una solicitud correspondiente sería el siguiente aspecto siguiente:
<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>
Ahora mi pregunta: ¿Es esto realmente la mejor solución disponible? ¿Es suficiente el XSD para entender qué está pasando?