XSD:如何实现多对多关系?

时间:2014-05-12 10:31:22

标签: xml xsd relationship

我们说客户与零售商之间存在多对多的关系。一个客户可以拥有多个零售商,一个零售商可以拥有多个客户。

所以,在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关系的方式。我有两个表(customerretailer)和第三个表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>
...

1 个答案:

答案 0 :(得分:1)

这个问题似乎与XSD无关。如果你愿意的话,你当然可以在你的XML文档中保持关系的两个方向(这取决于你),但是如果你这样做,那么当你编写代码来更新结构以保持它时,你就有责任关系的两个方向同步,并避免无限循环。这不是一个难题,但细节完全取决于您如何实施更新逻辑。