我的情况如下:
我有一个规范化的数据库,其中保存了有关机场的地理信息。结构是:
airport --is in--> city --is in--> country --is in--> continent
现在我想让用户管理这些数据,而不是让他们直接访问数据库。我们需要通过 Web 服务提供这个管理界面。
现在,在设计服务时,我们遇到了关于如何定义操作的讨论。我们提出了不同的解决方案:
方案A:具体操作
对于四个表(机场、城市、国家、大陆)中的每一个,我们定义了 3 个操作:
- 插入
- 得到
- 更新
这将导致 2 个请求/响应对象 = 24 个对象的 12 个操作
要创建一个具有所有依赖项的全新机场,至少需要 4 个请求。
解决方案 B:通用
只有一种操作,通过参数控制。此操作能够创建管理数据库所需的一切。
该操作将决定需要做什么并执行它。如果发生错误,它将回滚所有内容。
==> 1 个操作 = 2 个高度复杂的请求/响应对象
解决方案 C:在中间见面 1
每个表一个通用操作,能够执行 get、insert、update,就像解决方案 B 一样,但每个表都集中在一个表上。
==> 4 个操作 = 8 个复杂的请求/响应对象
方案 D:在中间相遇 2
每个操作(get、insert、delete)一个通用操作,它可以在每个表上工作并解决依赖关系。
==> 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 是否足以理解,这是怎么回事?