高级数据库技术 课程笔记二——对象关系数据库和XML

本文深入探讨了对象关系数据库系统(ORDBS)的概念,包括对象定义、类层次、继承性以及对象嵌套等核心要素,并对比了关系数据模型与面向对象数据模型。此外,文章还介绍了XML的特点及应用,如DTD和XML Schema的使用,以及XML数据的查询与处理方法。

一、对象关系数据库

对象关系数据库系统(ORDBS)是面向对象数据模型(Object Oriented Data Model, 简称OO模型)和关系数据模型相结合的产物

面向对象数据库系统支持OO模型

1.OO模型的核心概念

对象的定义:是由一组数据结构和在这组数据结构上的操作的程序代码封装起来的基本单位。 (由属性集合和方法集合组成)

对象标识OID:面向对象数据库中的每个对象都有一个唯一的不变的标识称为对象标识(OID) 。

在OODB中,一个对象是某一的一个实例

=====================================

2.类层次和继承

相似的对象之间的公共属性和方法部分可以统一定义,各自的特殊属性和方法部分可以分别定义。为此,面向对象数据结构给出了类层次结构

类层次结构实例
单继承:一个子类只能继承一个超类的特性(包括属性和方法)
层次结构图是一棵树

多重继承:一个子类能继承多个超类的特性
层次结构图是一个带根的有向无回路图
在这里插入图片描述
继承性的优点
第一,建模的有力工具,提供了对现实世界简明而精确的描述。
第二,提供了信息重用机制。

=======================================

3.对象嵌套
设Obj1和Obj2是两个对象。如果Obj2是Obj1的某个属性的值,称Obj2属于Obj1,或Obj1包含Obj2

对象嵌套实例

=======================================
4.关系数据模型与OO模型的比较

在这里插入图片描述

二、XML(eXtended Markup Language)

可扩展的标记语言,相对于HTML,XML具有如下的一些特点: ▪ 更多的结构和语义 ▪ 可扩展性 ▪ 自描述性 ▪ 数据与显示分离 ▪ 简洁性

在这里插入图片描述
1.文档类型定义DTD
用来描述XML文档的结构,类似于模式的概念

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带DTD的XML文档实例:

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

以上 DTD 解释如下: !DOCTYPE note (第二行)定义此文档是 note 类型的文档。 !ELEMENT note
(第三行)定义 note 元素有四个元素:“to、from、heading,、body” !ELEMENT to (第四行)定义 to
元素为 “#PCDATA” 类型 !ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型 !ELEMENT
heading (第六行)定义 heading 元素为 “#PCDATA” 类型 !ELEMENT body (第七行)定义 body
元素为 “#PCDATA” 类型

2.XML Schema
用XML来定义其文档的模式,支持对结构和数据类型的定义(XML Schema 最重要的能力之一就是对数据类型的支持。)

同样的元素定义使用XML Schema编写:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
	<xs:element name="to" type="xs:string"/>
	<xs:element name="from" type="xs:string"/>
	<xs:element name="heading" type="xs:string"/>
	<xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

3.DTD和XML Schema比较

外部引用:
在这里插入图片描述
特征比较:
在这里插入图片描述

============================================
XMLQuery函数
❖ XML数据的查询语言
❖ SQL/XML提供将XQuery嵌入SQL的机制,对存储在关系
数据库中的XML数据可以用XQuery进行查询
❖ 返回的数据类型为XML

实例: 选出价格低于80的所有英文书,返回价格和作者名

SELECT XMLQUERY(for $bib in $doc/bib[lang/text()='English'],
		 $book in $bib//book 
WHERE $book/@price < 80 
RETURN <bookInfo> {$book/@price}{$book/author/name} </bookInfo>' 
PASSING bib AS "doc" RETURN CONTENT) AS "result" 
FROM bookstore;

XMLTable函数
从XML数据中提取信息,返回结果是一个二维的关系
表(列的定义用XPath路径表达式)

实例:选出价格低于80的英文书,显示书名、作者名、出版年 份和价格(返回关系表的格式)。

SELECT T.title,T.author,T.year,T.price
 FROM bookstore AS BXMLTABLE( 'for$bib in $doc/bib[lang/text()='English'],
   $book in $bib//book WHERE $book/@price < 80 
   RETURN $book' 
   PASSING B.bib AS "doc" 
   COLUMNS "title" VARCHAR(100)     PATH './title'"year" INTEGER              PATH './year'"price" DOUBLE              PATH './@price'"author" VARCHAR(30)   PATH './author/name' ) 
   AS T

XMLExists
检查XQuery查询在XML数据上的执行结果是否为非空,如果查询结果是一个空序列,则谓词返回假,否则为真

实例:查询标了价格的所有书目。

SELECT id,bib
FROM bookstore
WHERE XMLEXISTS(' $doc/bib/book/@price' PASSING bib AS "doc")
### 环境准备 确保已安装好osgEarthPostgreSQL数据库,并且PostgreSQL中存储有矢量数据。同时要保证osgEarth编译时开启了对PostgreSQL的支持。 ### 配置文件编写 osgEarth通常使用配置文件(.earth文件)来加载数据。以下是一个简单的示例,展示如何在.earth文件中配置加载PostgreSQL数据库中的矢量数据: ```xml <map name="PostgreSQL Vector Data" type="geocentric"> <options> <cache type="filesystem" path="cache"/> </options> <layers> <featurelayer name="PostgreSQL Vector Layer"> <driver name="postgis"> <db connection="host=localhost dbname=your_database user=your_user password=your_password"/> <table name="your_table" primary_key="id" geometry_column="geom"/> <feature_profile> <srs>wkt:EPSG:4326</srs> </feature_profile> </driver> <style> <rule> <symbolizer class="polygon"> <fill color="#FF0000" alpha="0.5"/> <stroke color="#000000" width="1"/> </symbolizer> </rule> </style> </featurelayer> </layers> </map> ``` 在上述配置文件中: - `<db connection>`:指定连接到PostgreSQL数据库的信息,包括主机名、数据库名、用户名密码。 - `<table>`:指定要查询的表名、主键列几何列名。 - `<feature_profile>`:指定数据的空间参考系统。 - `<style>`:定义了矢量数据的显示样式,这里设置了多边形的填充颜色边框样式。 ### 代码加载 以下是一个简单的C++代码示例,用于加载上述配置文件并显示数据: ```cpp #include <osgViewer/Viewer> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> int main() { osgViewer::Viewer viewer; osg::ref_ptr<osgEarth::Map> map = osgEarth::Map::create(); osg::ref_ptr<osgEarth::MapNode> mapNode = new osgEarth::MapNode(map); // 加载.earth文件 osg::ref_ptr<osg::Node> earthNode = osgDB::readRefFile("your_config.earth"); if (earthNode.valid()) { mapNode->setMap(earthNode->asGroup()->getChild(0)->as<osgEarth::MapNode>()->getMap()); } viewer.setSceneData(mapNode); viewer.setCameraManipulator(new osgEarthUtil::EarthManipulator()); return viewer.run(); } ``` ### 注意事项 - 确保数据库连接信息正确,包括主机名、数据库名、用户名密码。 - 确认表名、主键列几何列名与数据库中的实际情况一致。 - 若数据的空间参考系统与配置文件中指定的不一致,可能会导致数据显示位置错误,需要进行坐标转换。 ### 错误排查 - 如果无法连接到数据库,检查数据库服务是否正常运行,以及连接信息是否正确。 - 若数据未显示,检查表名、列名空间参考系统是否正确,也可以查看osgEarth的日志信息来定位问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值