Je suis d'accord avec le conseil de cdragon ci-dessous pour éviter l'option #2. Le choix entre les options 1 et 3 est en grande partie une question de style. J'aime utiliser des attributs pour ce que je considère comme des attributs de l'entité, et des éléments pour ce que je considère comme des données. Parfois, il est difficile de classer les choses. Néanmoins, aucun des deux n'est "mauvais".
Et puisque nous parlons de conception de schémas, j'ajouterai mon grain de sel concernant le niveau de réutilisation (maximale) que je préfère (des éléments et des types), ce qui peut également faciliter le référencement "logique" externe de ces entités dans, par exemple, un dictionnaire de données stocké dans une base de données.
Notez que si le schéma "Garden of Eden" offre le maximum de réutilisation, il implique également le plus de travail. Au bas de cet article, j'ai fourni des liens vers les autres schémas abordés dans la série de blogs.
- L'approche du Jardin d'Eden http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx
Utilise une approche modulaire en définissant tous les éléments de manière globale et, comme dans l'approche du store vénitien, toutes les définitions de type sont déclarées de manière globale. Chaque élément est défini globalement comme un enfant immédiat du nœud et son attribut de type peut être défini comme l'un des types complexes nommés.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified"/>
<xs:element name="BookInformation" type="BookInformationType"/>
<xs:complexType name="BookInformationType"/>
<xs:sequence>
<xs:element ref="Title"/>
<xs:element ref="ISBN"/>
<xs:element ref="Publisher"/>
<xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PeopleInvolvedType">
<xs:sequence>
<xs:element name="Author"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Title"/>
<xs:element name="ISBN"/>
<xs:element name="Publisher"/>
<xs:element name="PeopleInvolved" type="PeopleInvolvedType"/>
</xs:schema>
L'avantage de cette approche est que les schémas sont réutilisables. Puisque les éléments et les types sont définis globalement, ils peuvent être réutilisés. Cette approche offre le maximum de contenu réutilisable. L'inconvénient est que le schéma est verbeux. Cette conception serait appropriée lorsque vous créez des bibliothèques générales dans lesquelles vous pouvez vous permettre de ne pas faire d'hypothèses sur la portée des éléments et des types du schéma et leur utilisation dans d'autres schémas, en particulier en ce qui concerne l'extensibilité et la modularité.
Puisque chaque type et élément distinct a une définition globale unique, ces particules/composants canoniques peuvent être reliés de manière univoque à des identifiants dans une base de données. Et si, à première vue, le maintien des associations entre les particules/composants XSD textuels et la base de données peut sembler une tâche manuelle fastidieuse et permanente, SQL Server 2005 peut en fait générer des identifiants de composants de schéma canoniques via l'instruction
CREATE XML SCHEMA COLLECTION
http://technet.microsoft.com/en-us/library/ms179457.aspx
À l'inverse, pour construire un schéma à partir des particules canoniques, SQL Server 2005 fournit la fonction
SELECT xml_schema_namespace function
http://technet.microsoft.com/en-us/library/ms191170.aspx
ca-non-i-cal Relatif aux mathématiques. (d'une équation, d'une coordonnée, etc.) "sous sa forme la plus simple ou standard". http://dictionary.reference.com/browse/canonical
D'autres schémas, plus faciles à construire, mais moins fiables et plus "dénormalisés/redondants", sont notamment les suivants
- L'approche de la poupée russe http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx
Le schéma comporte un seul élément global - l'élément Root. Tous les autres éléments et types sont imbriqués progressivement plus profondément, ce qui lui donne son nom, car chaque type s'insère dans celui qui le précède. Puisque les éléments de cette conception sont déclarés localement, ils ne seront pas réutilisables par le biais des instructions import ou include.
- L'approche de la tranche de salami http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx
Tous les éléments sont définis globalement mais les définitions de type sont définies localement. De cette façon, d'autres schémas peuvent réutiliser les éléments. Avec cette approche, un élément global et son type défini localement fournissent une description complète du contenu de l'élément. Cette "tranche" d'informations est déclarée individuellement, puis regroupée et peut également être reconstituée pour construire d'autres schémas.
- L'approche du store vénitien http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx
Similaire à l'approche de la poupée russe dans la mesure où elles utilisent toutes deux un seul élément global. L'approche Venetian Blind décrit une approche modulaire en nommant et en définissant toutes les définitions de type globalement (par opposition à l'approche Salami Slice qui déclare les éléments globalement et les types localement). Chaque type défini globalement décrit une "lamelle" individuelle et peut être réutilisé par d'autres composants. En outre, tous les éléments déclarés localement peuvent être qualifiés ou non d'espace de nom (les lamelles peuvent être "ouvertes" ou "fermées") en fonction du paramètre de l'attribut elementFormDefault en haut du schéma.
1 votes
Bonne question, dommage qu'il n'y ait pas de réponse définitive :) Mais au moins, je sais que tout le monde s'en fiche et je peux continuer à concevoir mes schémas au hasard :)