介绍matisse--专为.net的后关系型数据库part 1 介绍
当我开始接触用于.net的数据库,我发现除了众所周知的一些数据库,如sql server、mysql以外,还有不少选择。matisse就是其中之一,它是一种后关系型数据库(post-relational database)。
为什么要选择matisse呢? 那是因为它是我所知道的,唯一专为.net进行扩充,具有全部的对象性能和原生.net支持的数据库。它主要的性能包括用户自定义类型,继承,多态和简单的数据模型等。过去的两年里,我在多个需要复杂数据模型的.net项目中获取了matisse的实际工作知识。
如果有人想要找一篇详尽的文章,能够对主流的关系型数据库和其他产品进行深层次的比较。我还没有看到一个简单的,渐进的教程,能帮助那些希望能够接触新一代数据库的开发人员 。因此,我决定发布一系列的短文去填补这一空白,这是第一篇文章。
这第一篇文章主要是对用matisse进行sql编程作一个简介。接下来的文章里,将更加详细的介绍如何使用.net 和 asp.net去开发数据库应用程序。
安装
安装matisse非常的简单和快速. 进入matisse下载站点 http://www.matisse.com/developers/downloads/,并在"matisse dbms 7.0.x"区中下载下面两个文件:
1. intel - ms windows (文件名是 matisse70x.exe)
2. .net binding (文件名是 matissedotnet70x.exe)
第一个文件安装数据库服务、管理和开发工具以及一个通用的客户端链接库,该链接库可为不同的语言共享,比如c#, vb.net等。第二个文件包含一个.net的装配件(assembly),其提供对象永久化服务和一个原生的ado.net提供者。
译者注:在这里,我把native ado.net data provider翻译为原生的ado.net提供者.
要安装matisse,你需要拥有windows 系统管理员级别(administrator)的权限, 机器的基本配置:windows nt, 2000, 或者xp, 64mb内存以及100mb的硬盘空间。首先,执行matisse70x.exe文件,跟随安装向导的指引,当出现安装类型时,记得选择"typical/full",安装过程将在几分钟内结束。接着,执行matissedotnet70x.exe文件,安装.net接口,选择与前一个安装相同的目录。
在开始使用之前,你应该看看以下几个文档:
1. discovering matisse enterprise manager (from readme.html)
2. building reusable components with sql psm (from readme.html)
3. getting started with matisse
你也可以在以下网址找到一些编程,数据库管理和安装方面的指引:
http://www.matisse.com/developers/documentation/.
如果有rational rose建模工具,你也可以下载matisse rose link(matisseroselink70x.exe)。它允许你使用uml来定义和维护数据库schema。
记住,你也可以在linux上面运行你的database服务器,然后在windows上发布你的.net应用程序。你只需要下载linux版的matisse(matisse-7.0-x.i386.rpm)并用rpm安装,如果你使用的是redhat 8,在运行rmp之前,你需要修改环境变量rpm_install_prefix 为/usr/local/matisse。
> rpm -ihv matisse-7.0-x.i386.rpm
使用matisse enterprise manager你可以做什么?
在开始写一个演示程序之前,让我们看一些enterprise manager的有趣特性。
1. 你可以象其他那些收费软件一样,浏览一个数据库中的类,属性,关系和sql方法。其中一个有趣的特性,你可以看到一个类的所有属性(比如属性,关系和方法)以及子类的属性。这样,当你在类中写一个sql声明的时候,这个特性就变得很有用,因为你不用在父类和子类之间来回切换,以查找某一个属性。
2. 数据倒入(csv)
使用csv(comma-separated)文件,你可以从关系型数据库中倒入数据。当你从csv文件倒入数据,文件中的每一行被存为一个数据对象。所有的csv文件倒入结束后,你需要定义一个描述数据库中不同对象之间链接关系的xrd文件(xml relationship definition)。随后根据你uml中的描述,数据库中的对象被整合成一个有意义的语义网络。对象之间的关系会在sql查询时,提供一个明显的性能优化。
简单演示
在这篇文章中,我将会展示一个简单的演示应用程序,以介绍如何使用sql去定义一个schema和操作数据对象。在接下来的文章中,我们会进行更深入的讨论。
首先,你需要开启一个数据库。执行enterprise manager,选中一个数据库,然后点选start菜单。几秒钟之后,数据库将被启动。
在这个演示程序中,我们将使用项目管理模式。其中定义了三个类:project, employee和manager。其关系如下:
如果有rational rose, 可以非常方便的倒入uml图。选择tools -> matisse -> export to database…菜单:
如果有rational rose, 你可以使用sql ddl或者odl(object definition language)。下面的ddl 语句和前面的uml图是等效的。
create table project (
projectname string,
budget numeric(19,2),
members references (employee)
cardinality (1, -1)
inverse employee.worksin,
managedby references (manager)
cardinality (1, 1)
inverse manager.manages
);
create table employee (
name string,
birthdate date,
worksin references (project)
inverse project.members
);
create table manager under employee (
title string,
manages references (project)
inverse project.managedby
);
要执行上面的ddl statement,复制到sql query analyzer窗口,执行。
到此,你应该看到了用matisse进行数据库建模的优点了吧!你不需要改动你的模式,所有的类和其他的容器之间的关系已经被保留在数据库的schema中了。对于维护和扩展应用程序,这是一个很大的优势。
现在,我们可以在数据库中建立对象了。在sql query analyzer窗口中执行下面的代码:
insert into employee (name, birthdate)
values ('john venus', date '1955-10-01')
returning into emp1;
insert into employee (name, birthdate)
values ('amy mars', date '1965-09-25')
returning into emp2;
insert into manager (name, birthdate, title)
values ('ken jupiter', date '1952-12-15', 'director')
returning into mgr1;
insert into project (projectname, budget, managedby, members)
values ('campaign spring 04', 10000.00, mgr1, selection(emp1, emp2));
上面的代码创建了两个employee对象,一个manager对象,一个project对象。然后将这个两个雇员对象作为成员加入项目对象中,而经理对象作为项目的管理者加入。
要察看插入的对象,执行"select * from employee"语句
当你按照employee查找,查询会返回两种类的对象-employee 和 manager。因为它们都继承至类employee。但是,manager对象中的一些属性,比如title是不会显示在结果表中的,因为这些属性并没有包括在类employee,而是在其子类中。
你可以定义类的sql方法。语法遵循sql psm (persistent stored module).举例说明一下,让我们定义一个实例方法age(),该方法返回雇员的年龄。
create method age()
returns integer
for employee
begin
return extract(year from current_date) - extract(year from self.birthdate);
end;
在sql query analyzer窗口中执行上述语句,然后试试下面的查询语句。
select * from employee emp where emp.age() > 40;
age()这个方法在employee中定义,其子类manager也继承了这一方法,当然,你也可以象在.net一样使用它,比如在manager类中覆写这个方法,或者使用它的多态特性。
下一篇文章
在这篇文章中,我简单的介绍了使用matisse进行sql编程,并展示了它的对象特性,比如继承和关系。在接下来的文章中,我将更加详细的逐个介绍,并讨论它的技术优势和劣势。