Моя ситуация такова:
У меня есть нормализованная база данных, в которой я храню географическую информацию об аэропортах. Структура:
airport --is in--> city --is in--> country --is in--> continent
Теперь я хочу позволить пользователям администрировать эти данные, не предоставляя им прямой доступ к базе данных. Нам нужно предложить этот интерфейс администрирования через веб-сервис.
Теперь, когда речь идет о разработке сервиса, мы вступили в дискуссию о том, как определить операции. Мы придумали разные решения:
Решение A: конкретные операции
Для каждой из четырех таблиц (аэропорт, город, страна, континент) мы определяем 3 операции:
- вставить
- получить
- обновление
Это приведет к 12 операциям с 2 объектами запроса / ответа = 24 объекта
Чтобы создать новый аэропорт со всеми зависимостями, потребуется как минимум 4 запроса.
Решение B: универсальное
Существует только одна операция, которая контролируется с помощью параметров. Эта операция способна создать все необходимое для администрирования базы данных.
Операция решает, что нужно сделать, и выполняет ее. Если произойдет ошибка, она откатит все назад.
==> 1 операция = 2 очень сложных объекта запроса / ответа
Решение C: Встреча в середине 1
Одна общая операция для таблицы, которая может выполнять get, insert, update, как решение B, но ориентирована на одну таблицу.
==> 4 операции = 8 сложных объектов запроса / ответа
Решение D: Встреча в середине 2
Одна общая операция на действие (получение, вставка, удаление), которая может работать с каждой таблицей и разрешать зависимости.
==> 3 операции = 6 немного более сложных объектов запроса / ответа
* ** 1054 тысяча пятьдесят три * Пример
Поскольку это было довольно абстрактно, вот упрощенный пример создания объектов запроса (JFK / New York / USA / North America):
Решение A:
Запрос 1/4:
<insertContinent>North America</insertContinent>
Запрос 2/4:
<insertCountry continent="North America">USA</insertCountry>
Запрос 3/4:
<insertCity country="USA">New York</insertCity>
Запрос 4/4:
<insertAirport city="New York">JFK</insertAirport>
Раствор B:
Запрос 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>
Раствор C:
Запрос 1/4:
<countryAction type="insert" parent="North America">USA</countryAction>
Запрос 2/4:
<airportAction type="insert" parent="New York">JFK</airportAction>
Запрос 3/4:
<continentAction type="insert" parent="">North America</continentAction >
Запрос 4/4:
<cityAction type="insert" parent="USA">New York</cityAction >
Решение D:
Запрос 1/1:
<insert airport="JFK" city="New York" country="USA" continent="North America" />
Решение D кажется мне довольно элегантным, поэтому я попытался поместить это в XSD:
Код:
<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>
Соответствующий запрос будет выглядеть следующим образом:
<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>
Теперь мой вопрос: Это действительно лучшее из доступных решений? Достаточно ли XSD, чтобы понять, что происходит?