我们说客户与零售商之间存在多对多的关系。一个客户可以拥有多个零售商,一个零售商可以拥有多个客户。
所以,在XSD中,我写了这样的东西:
<xs:schema xmlns="http://mynamespace"
targetNamespace="http://mynamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shop">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="retailer" />
<xs:element ref="customer" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="retailer">
<xs:complexType>
<xs:sequence>
<xs:element ref="customer" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element ref="retailer" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
此处的问题是,当我想插入retailer R1
时,我会将customer C1
与他关联,然后再次retailer R1
关联R1 -> C1 -> R1
}) - 产生一个很好的递归循环。
那么应该怎样处理这些案件呢?
所以我想到的是类似于RDBM处理n-m关系的方式。我有两个表(customer
和retailer
)和第三个表customer_retailer
,它只包含其他两个表的主键作为唯一的外键对。
在XSD中,我可以想象的是,我让用户独立于另一个创建零售商和客户,并且在每个元素 - 实例内部仅引用特定元素的键。也就是说,我不这样做:
<retailer>
<customer>
<retailer>
...
</retailer>
</customer>
</retailer>
但是这个:
<retailer id="r1">
<customer ref_id="c1" />
<customer ref_id="c2" />
</retailer>
<customer id="c1">
<retailer ref_id="r1" />
<retailer ref_id="r2" />
</customer>
...
答案 0 :(得分:1)
这个问题似乎与XSD无关。如果你愿意的话,你当然可以在你的XML文档中保持关系的两个方向(这取决于你),但是如果你这样做,那么当你编写代码来更新结构以保持它时,你就有责任关系的两个方向同步,并避免无限循环。这不是一个难题,但细节完全取决于您如何实施更新逻辑。