我同意以下cdragon的建议,避免选项#2。选择#1和#3主要是风格问题。我喜欢使用属性来表示实体的属性,使用元素来表示数据。有时候很难分类。但两者都不是“错误”的。
顺便说一下模式设计的话题,我想提出我偏爱的最大复用级别(元素和类型),这也可以促进在数据库中存储的数据字典中对这些实体的外部“逻辑”引用。
请注意,“伊甸园”模式提供了最大的复用性,但也需要最多的工作量。在本文底部,我提供了博客系列中涵盖的其他模式的链接。
• 伊甸园方法 http://blogs.msdn.com/skaufman/archive/2005/05/10/416269.aspx
使用模块化方法定义所有元素,并像百叶窗方法一样声明所有类型定义为全局。每个元素被全局定义为节点的直接子元素,并且其类型属性可以设置为命名复杂类型之一。
<?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>
这种方法的优点是模式可重用。由于元素和类型都是全局定义的,因此两者都可以重复使用。这种方法提供了最大量的可重复使用内容。
缺点是模式过于冗长。
当您正在创建通用库时,可以对模式元素和类型的范围及其在其他模式中的使用特别是在可扩展性和模块化方面不作任何假设时,这将是一个适当的设计。
由于每个不同的类型和元素都具有单个全局定义,这些基本粒子/组件可以一对一地与数据库中的标识符相关联。尽管乍一看似乎需要费力的手动维护文本XSD粒子/组件与数据库之间的关联,但实际上SQL Server 2005可以通过语句生成规范模式组件标识符。
CREATE XML SCHEMA COLLECTION
http://technet.microsoft.com/en-us/library/ms179457.aspx
相反,为了从规范粒子构建模式,SQL Server 2005提供了{{}}。
SELECT xml_schema_namespace function
http://technet.microsoft.com/en-us/library/ms191170.aspx
ca·non·i·cal
与数学相关。(方程、坐标等) "以最简或标准形式"
http://dictionary.reference.com/browse/canonical
其他更易构建但不太可重用/更"非规范化/冗余"的模式包括
• 俄罗斯套娃方法 http://blogs.msdn.com/skaufman/archive/2005/04/21/410486.aspx
模式只有一个全局元素-根元素。所有其他元素和类型逐渐嵌套,因为每个类型都适合于其上面的类型而得名。由于该设计中的元素是本地声明的,因此它们将无法通过导入或包含语句进行重用。
• 薄片萨拉米方法 http://blogs.msdn.com/skaufman/archive/2005/04/25/411809.aspx
所有元素都在全局范围内定义,但类型定义在本地定义。这样其他模式可以重用元素。使用此方法,带有其本地定义类型的全局元素提供了元素内容的完整描述。这些信息“片段”被单独声明,然后聚合在一起,并且还可以组合在一起构建其他模式。
• 百叶窗式方法 http://blogs.msdn.com/skaufman/archive/2005/04/29/413491.aspx
与俄罗斯套娃方法类似,它们都使用单个全局元素。百叶窗式方法通过为所有类型定义命名和定义全局来描述一种模块化方法(与切片法不同,后者在全局声明元素并在本地声明类型)。每个全局定义的类型描述了一个单独的“板条”,可以被其他组件重用。此外,所有本地声明的元素可以是命名空间限定或非命名空间限定(根据模式顶部的elementFormDefault属性设置,“板条”可以“打开”或“关闭”)。