私の状況は次のとおりです。
空港に関する地理情報を保持する正規化されたデータベースがあります。構造は次のとおりです。
airport --is in--> city --is in--> country --is in--> continent
ここで、データベースへの直接アクセスを許可せずに、ユーザーがこのデータを管理できるようにしたいと考えています。この管理インターフェースを Web サービス経由で提供する必要があります。
さて、サービスの設計に関しては、操作を定義する方法についての議論に出くわしました。私たちはさまざまな解決策を考え出しました:
ソリューション A: 特定の操作
4 つのテーブル (空港、都市、国、大陸) のそれぞれに対して、3 つの操作を定義します。
- 入れる
- 得る
- アップデート
これにより、2 つの要求/応答オブジェクト = 24 オブジェクトで 12 の操作が発生します。
すべての依存関係を持つまったく新しい空港を作成するには、少なくとも 4 つのリクエストが必要です。
ソリューション B: 一般的な
パラメータによって制御される操作は 1 つだけです。この操作では、データベースの管理に必要なすべてを作成できます。
操作は、何を行う必要があるかを決定し、それを実行します。エラーが発生すると、すべてがロールバックされます。
==> 1 つの操作 = 2 つの非常に複雑な要求/応答オブジェクト
ソリューション C: 途中で会う 1
テーブルごとに 1 つの一般的な操作。ソリューション B と同様に、取得、挿入、更新を実行できますが、それぞれ 1 つのテーブルに焦点を当てています。
==> 4 つの操作 = 8 つの複雑な要求/応答オブジェクト
ソリューション D: 真ん中で会う 2
アクションごとに 1 つの一般的な操作 (取得、挿入、削除)。これは、各テーブルで機能し、依存関係を解決できます。
==> 3 つの操作 = 6 つのもう少し複雑な要求/応答オブジェクト
例
これはかなり抽象的だったので、リクエストオブジェクトを作成するための単純化された例 (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 は何が起こっているのかを理解するのに十分ですか?