Udostępnij za pośrednictwem


Relacje i ograniczenia schematu XML

W schemacie języka definicji schematu XML (XSD) można określić ograniczenia (ograniczenia unikatowe, klucz i keyref) i relacje (przy użyciu adnotacji msdata:Relationship ). W tym temacie wyjaśniono, jak ograniczenia i relacje określone w schemacie XML są interpretowane w celu wygenerowania elementu DataSet.

Ogólnie rzecz biorąc, w schemacie XML należy określić adnotację msdata:Relationship , jeśli chcesz wygenerować tylko relacje w zestawie danych. Aby uzyskać więcej informacji, zobacz Generowanie relacji zestawu danych na podstawie schematu XML (XSD). Należy określić ograniczenia (unikatowe, klucz i keyref), jeśli chcesz wygenerować ograniczenia w zestawie danych. Należy pamiętać, że ograniczenia klucza i klucza są również używane do generowania relacji, jak wyjaśniono w dalszej części tego tematu.

Generowanie relacji na podstawie ograniczeń klucza i klucza

Zamiast określać adnotację msdata:Relationship , można określić ograniczenia klucza i klucza, które są używane podczas procesu mapowania schematu XML w celu wygenerowania nie tylko ograniczeń, ale także relacji w zestawie danych. Jeśli jednak określisz msdata:ConstraintOnly="true" element keyref , zestaw danych będzie zawierać tylko ograniczenia i nie będzie zawierać relacji.

W poniższym przykładzie przedstawiono schemat XML zawierający elementy Order i OrderDetail , które nie są zagnieżdżone. Schemat określa również ograniczenia klucza i klucza.

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
  
 <xs:element name="MyDataSet" msdata:IsDataSet="true">  
  <xs:complexType>  
    <xs:choice maxOccurs="unbounded">  
      <xs:element name="OrderDetail">  
       <xs:complexType>  
         <xs:sequence>  
           <xs:element name="OrderNo" type="xs:integer" />  
           <xs:element name="ItemNo" type="xs:string" />  
         </xs:sequence>  
       </xs:complexType>  
      </xs:element>  
      <xs:element name="Order">  
        <xs:complexType>  
          <xs:sequence>  
            <xs:element name="OrderNumber" type="xs:integer" />  
            <xs:element name="EmpNumber" type="xs:integer" />  
          </xs:sequence>  
        </xs:complexType>  
      </xs:element>  
    </xs:choice>  
  </xs:complexType>  
  
  <xs:key name="OrderNumberKey"  >  
    <xs:selector xpath=".//Order" />  
    <xs:field xpath="OrderNumber" />  
  </xs:key>  
  
  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">  
    <xs:selector xpath=".//OrderDetail" />  
    <xs:field xpath="OrderNo" />  
  </xs:keyref>  
 </xs:element>  
</xs:schema>  

Zestaw danych generowany podczas procesu mapowania schematu XML obejmuje tabele Order i OrderDetail . Ponadto zestaw DataSet zawiera relacje i ograniczenia. W poniższym przykładzie przedstawiono te relacje i ograniczenia. Należy pamiętać, że schemat nie określa adnotacji msdata:Relationship ; zamiast tego ograniczenia klucza i keyref są używane do generowania relacji.

....ConstraintName: OrderNumberKey  
....Type: UniqueConstraint  
....Table: Order  
....Columns: OrderNumber  
....IsPrimaryKey: False  
  
....ConstraintName: OrderNoRef  
....Type: ForeignKeyConstraint  
....Table: OrderDetail  
....Columns: OrderNo  
....RelatedTable: Order  
....RelatedColumns: OrderNumber  
  
..RelationName: OrderNoRef  
..ParentTable: Order  
..ParentColumns: OrderNumber  
..ChildTable: OrderDetail  
..ChildColumns: OrderNo  
..ParentKeyConstraint: OrderNumberKey  
..ChildKeyConstraint: OrderNoRef  
..Nested: False  

W poprzednim przykładzie schematu elementy Order i OrderDetail nie są zagnieżdżone. W poniższym przykładzie schematu te elementy są zagnieżdżone. Nie określono jednak adnotacji msdata:Relationship; w związku z tym przyjmuje się, że przyjmuje się niejawną relację. Aby uzyskać więcej informacji, zobacz Mapuj niejawne relacje między zagnieżdżonym elementami schematu. Schemat określa również ograniczenia klucza i klucza.

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
  
 <xs:element name="MyDataSet" msdata:IsDataSet="true">  
  <xs:complexType>  
    <xs:choice maxOccurs="unbounded">  
  
      <xs:element name="Order">  
        <xs:complexType>  
          <xs:sequence>  
            <xs:element name="OrderNumber" type="xs:integer" />  
            <xs:element name="EmpNumber" type="xs:integer" />  
  
            <xs:element name="OrderDetail">  
              <xs:complexType>  
                <xs:sequence>  
                  <xs:element name="OrderNo" type="xs:integer" />  
                  <xs:element name="ItemNo" type="xs:string" />  
                </xs:sequence>  
              </xs:complexType>  
            </xs:element>  
          </xs:sequence>  
        </xs:complexType>  
      </xs:element>  
    </xs:choice>  
  </xs:complexType>  
  
  <xs:key name="OrderNumberKey"  >  
    <xs:selector xpath=".//Order" />  
    <xs:field xpath="OrderNumber" />  
  </xs:key>  
  
  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">  
    <xs:selector xpath=".//OrderDetail" />  
    <xs:field xpath="OrderNo" />  
  </xs:keyref>  
 </xs:element>  
</xs:schema>  

Zestaw danych wynikający z procesu mapowania schematu XML zawiera dwie tabele:

Order(OrderNumber, EmpNumber, Order_Id)  
OrderDetail(OrderNumber, ItemNumber, Order_Id)  

Zestaw danych zawiera również dwie relacje (jedną opartą na adnotacji msdata:relationship , a drugą na podstawie ograniczeń klucza i keyref) oraz różne ograniczenia. W poniższym przykładzie przedstawiono relacje i ograniczenia.

..RelationName: Order_OrderDetail  
..ParentTable: Order  
..ParentColumns: Order_Id  
..ChildTable: OrderDetail  
..ChildColumns: Order_Id  
..ParentKeyConstraint: Constraint1  
..ChildKeyConstraint: Order_OrderDetail  
..Nested: True  
  
..RelationName: OrderNoRef  
..ParentTable: Order  
..ParentColumns: OrderNumber  
..ChildTable: OrderDetail  
..ChildColumns: OrderNo  
..ParentKeyConstraint: OrderNumberKey  
..ChildKeyConstraint: OrderNoRef  
..Nested: False  
  
..ConstraintName: OrderNumberKey  
..Type: UniqueConstraint  
..Table: Order  
..Columns: OrderNumber  
..IsPrimaryKey: False  
  
..ConstraintName: Constraint1  
..Type: UniqueConstraint  
..Table: Order  
..Columns: Order_Id  
..IsPrimaryKey: True  
  
..ConstraintName: Order_OrderDetail  
..Type: ForeignKeyConstraint  
..Table: OrderDetail  
..Columns: Order_Id  
..RelatedTable: Order  
..RelatedColumns: Order_Id  
  
..ConstraintName: OrderNoRef  
..Type: ForeignKeyConstraint  
..Table: OrderDetail  
..Columns: OrderNo  
..RelatedTable: Order  
..RelatedColumns: OrderNumber  

Jeśli ograniczenie keyref odwołujące się do zagnieżdżonej tabeli zawiera adnotację msdata:IsNested="true" , zestaw Danych utworzy pojedynczą relację zagnieżdżoną opartą na ograniczeniu keyref i powiązanym ograniczeniu unikatowy/klucz.

Zobacz też