信息模型(Information Model)和数据模型(Data Model)有什么区别?XML作为一种数据模型有什么特点?

信息模型和数据模型

rfc3444 On the Difference between Information Models and Data Models中,J. Schoenwaelder试图对什么是信息模型,以及什么是数据模型做出一些区分。总而言之,信息模型用来表示事物固有的联系;而数据模型则用具体的可实现的方式来对信息模型进行描述。这么说其实也是挺模糊的,难以区分什么属于信息模型,什么属于数据模型。唯一的准绳就是看模型与实现的相关性,模型中参杂的实现细节越多,那么这个模型越属于数据模型。

就算是与实现不太相关的,用来描述事物内涵的信息模型,最后也是要通过某种形式展现在纸面或者屏幕上,供他人阅读。所以,没有绝对抽象的信息模型,只不过信息模型通常不涉及实现方式的描述。信息模型与数据模型是相对而言的,信息模型是数据模型的参照物。信息模型一般用比较通用的文字或者抽象的图示(比如UML)来描述。

J. Schoenwaelder在IETF 86, Orlando, 2013-03-14上的讲演Information Models, Data Models, and YANG以概要的方式重述了rfc3444的内容,如果不想看rfc3444的,可以阅读此讲演稿。

个人感悟,面向对象编程可以作为一个合适的用来解释数据模型和信息模型的例子。在C++中,有一种把接口与对象分离的技术,叫做Pimpl。就是说,在头文件中只声明一个对象的抽象的接口,而隐藏对其的实现;接口具体的实现在非头文件中定义。这样一来,接口就相对于实现而独立存在。就像信息模型相对于数据模型独立存在一样。这种方式演化到极端的一种结果,就是微软的COM技术(Component Object Model)。COM中用IDL来描述接口,用各种语言来实现接口。

XML数据实例

不管是信息模型,还是数据模型,最终都要产生相应的数据实例,而数据实例也是需要以某种格式存储。不得不说,XML就是一种非常通用的存储数据实例的格式。 

XML的语法非常简明,而且具有一定的结构:

<person>
  <name>John</name>
</person>

上面的数据不言自明,根据XML标签<person>/<name>就可以判断出上面的数据指代的是一个人的名字。

XML是一种基于文本的结构,所以有一些字符是要被保留作为XML专用,比如用于标签的<, >, </, />等等。然后标签与标签之间的空白其实也属于XML的结构,而不是其保护的数据内容。但是标签之内的空白则是作为数据,比如<name> John</name>,John前面的一个空格是算作数据的。

如果在XML的标签数据中使用空白的话,需要使用转义字符, 比如 space = &#032; tab = &#009; 参考Represent space and tab in XML tag。除了转义字符之外,也可以使用<![CDATA[&#x20;]]>这种形式。

XML的另外一个特性是标签可以具有属性,也就是说标签可以具备一定的上下文,比如:

<person id="1001">...</person>

上面的<person>具有一个属性id,值为“1001”。属性为XML提供的另一个纬度的信息,这也是XML比较独特的地方。不是所有的数据描述语言都有属性这个语言特性的,比如现在大热的JSON中就没有。所以将XML转为JSON的时候,如何处理XML的属性,是一个需要单独思考的问题。

结构上的简单导致XML的灵活性非常强。在XML的眼里,只有标签和数据,以及其他一些控制结构(比如注释和处理指令等等)。XML甚至不关心标签的具体含义是什么,只要求在结构上标签能够正确嵌套。对于标签上的属性,XML也没有做任何假设,既没有定义一个标签上可以有哪些属性,也没有定义哪些属性是可以继承到下一级标签的。

过于灵活可能会导致一个问题,那就是XML数据处理起来会比较麻烦。因为解析数据的时候,程序会面临这样的问题:数据中会出现任意种标签,每一种标签可以包含任意标签。万一出现了程序不认识的标签,或者标签的包含不是程序所预期的,那应该如何处理呢?

对于这个问题,XML给出了一个简单的解决方案,那就是命名空间(namespace)。XML种可以指定命名空间:

<person xmlns="urn:people" />

上面的xmlns="urn:people"就指定了一个命名空间。一个命名空间约定了什么样的标签可以出现在当前以及子孙节点上。这就给数据处理程序一个边界,方便程序实现。

如果要对XML中的数据作出更详细的规定,那么就需要使用模式(schema)来描述。模式给单薄的XML数据加上一层语义的外衣,使XML数据中的信息变得更加有序,更容易被解读。

XML的schema可以用几种方式来描述几种

  • W3C Schema
  • RelaxNG
  • Schematron

用来描述网络设备配置数据的YANG也可以算作一种模式语言。

模式与XML的关系,有点像编程语言与AST的关系,不同语言语法上有很大不同,但其AST的描述方式却都接近。

XML的版本

XML目前有1.0版本和1.1版本,其差别摘抄如下:

XML 1.1 updates XML so that it no longer depends on the specific Unicode version: you can always use the latest. It also adds checking of normalization, and follows the Unicode line ending rules more closely.

You are encouraged to create or generate XML 1.0 documents if you do not need the new features in XML 1.1; XML Parsers are expected to understand both XML 1.0 and XML 1.1.

其他参考

XML

schema相关

Pimpl相关

(完)