适用于 .NET 的后关系型数据库 Matisse 入门 - 第 1 部分






4.91/5 (44投票s)
2004 年 2 月 23 日
6分钟阅读

310303
逐步介绍新一代 .NET 数据库
引言
就 .NET 数据库而言,除了 SQL Server 或 MySQL 等知名选项之外,还有其他几种选择。其中之一是 Matisse,它是一款由 Matisse Software 开发的后关系型数据库。
为什么选择 Matisse?据我所知,它是唯一一款具有完整对象功能并原生支持 .NET 的 SQL 数据库。它具有用户定义的类型、继承、多态性以及具有声明性约束的简单数据模型等特性。在过去的两年里,我在处理需要复杂数据建模的多个 .NET 项目时,获得了 Matisse 的实践经验。
虽然可以找到一些提供主流关系型数据库与其他产品高层级比较的 press articles,但我还没有看到一个简单的分步教程来帮助那些想尝试新一代数据库的开发者。因此,我决定发布一系列简短的文章来填补这一空白。这是第一篇。
本文涵盖了 Matisse SQL 编程的快速概述。接下来的文章将每周发布,将更详细地介绍如何使用 .NET 和 ASP.NET 开发数据库应用程序。
安装
安装 Matisse 快速简便。访问 Matisse 下载网站 http://www.matisse.com/developers/downloads/,并在“Matisse DBMS 7.0.x”部分下载以下两个文件:
- Intel - MS Windows(文件名是 matisse70x.exe)
- .NET 绑定(文件名是 matisseDotNet70x.exe)
第一个文件安装数据库服务器、管理和开发工具,以及 Matisse 的通用客户端库,该库被包括 .NET(即 C# 和 VB.NET)在内的各种语言接口共享。第二个文件包含一个 .NET 程序集,它提供对象持久化服务和一个原生的 ADO.NET 数据提供程序。
要安装 Matisse,您需要拥有 Windows 管理员权限。系统要求是 Windows NT、2000 或 XP,64MB 内存和 100MB 磁盘空间。首先,启动 matisse70x.exe 文件,按照说明进行操作,并选择“典型/完整”作为安装类型。安装将在几分钟内完成。然后,启动 matisseDotNet70x.exe 来安装 .NET 接口。选择与第一次安装相同的目录作为目标文件夹(即 matisse70x.exe)。
您首先要查看的文档是:
- 探索 Matisse Enterprise Manager(来自 Readme.html)
- 使用 SQL PSM 构建可重用组件(来自 Readme.html)
- Matisse 入门
还可以在 http://www.matisse.com/developers/documentation/ 找到包括编程指南、管理指南和安装指南在内的许多文档。
如果您有 Rational Rose 建模工具,可以下载 Matisse Rose Link(matisseRoseLink70x.exe)。您可以使用 Rational Rose 通过 UML 定义和维护数据库模式。
请注意,在 Windows 上部署 .NET 应用程序时,可以在 Linux 上运行数据库服务器。下载 Matisse 的 Linux 版本(matisse-7.0-x.i386.rpm)并使用 rpm 进行安装。如果您使用的是 RedHat 8,则需要在运行 rpm 之前将环境变量 RPM_INSTALL_PREFIX
设置为 /usr/local/matisse。
> rpm -ihv matisse-7.0-x.i386.rpm
要求
Matisse .NET 绑定需要 Microsoft .NET Framework 1.1,而不是 1.0。如果您使用的是 Visual Studio .NET 2002,则需要将其升级到 Visual Studio .NET 2003。(因为即使您的 PC 上安装了 .NET Framework 1.1,Visual Studio .NET 2002 仍会继续使用 .NET Framework 1.0 进行编译。)
对于 Linux 上的 Mono 用户,Matisse 公司似乎正在准备 Mono 版本的 .NET 绑定,以便您可以在 Linux 上开发和部署 Mono 应用程序。
您可以使用 Matisse Enterprise Manager 执行的操作
在编写一个简单的 SQL 演示程序之前,让我们看看 Enterprise Manager 的一些有趣功能。
- 您可以像其他供应商的工具一样浏览数据库中的类、属性、关系和 SQL 方法。一个有趣的特性是,一个类可以显示其所有属性(即属性、关系和方法),包括其超类的属性。因此,当您在类上编写 SQL 语句时,此功能非常有用,因为您不必在超类和子类之间来回切换来查找属性。
- 数据导入(CSV)
您可以通过 CSV(逗号分隔值)文件从关系型数据库导入数据。导入 CSV 文件时,文件中的每一行(记录)都将作为数据对象存储在 Matisse 数据库中。导入所有 CSV 文件后,您需要指定一个 XRD 文件(XML Relationship Definition),该文件描述了如何在数据库中的对象之间建立链接。然后,数据库中的对象相互关联,构建一个与您的 UML 图相匹配的有意义的语义网络。对象之间的关系在 SQL 查询方面也提供了显著的性能优势。
简单演示
在本文中,我将展示一个简单的演示应用程序,该应用程序演示了如何使用 SQL 定义模式和操作 Matisse 中的数据对象。更详细的讨论将在后续文章中进行。
首先,您需要启动数据库。启动 Enterprise Manager,选择一个数据库,然后选择“启动”菜单。数据库将在几秒钟内上线。
我们将使用的数据模型是项目管理的,其中我们定义了三个类 Project
、Employee
和 Manager
,如下一张图中的 UML 所示。
如果您有 Rational Rose,可以直接将 UML 图导出到数据库。在“工具/Matisse”下的“导出到数据库…”菜单中进行选择。
如果您没有 Rational Rose,可以使用 SQL DDL 或 ODL(对象定义语言)。以下 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 语句,请将其复制并粘贴到 SQL 查询分析器窗口中,然后执行。
在这里,您可以看到 Matisse 数据库建模的优势。您不需要转换模型,所有关于类之间关联及其约束的语义信息都保留在数据库模式中。这对于应用程序的维护和扩展来说是一个很大的优势。
我们现在可以在数据库中创建对象。在 SQL 查询分析器窗口中执行以下 SQL 语句,如上所示:
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
的对象,因为 Manager
继承自 Employee
。但是,结果表不包括 Manager
的特定属性,例如 Title
,因为属性 Title
从 Employee
类是不可见的。
您可以为类定义 SQL 方法。语法遵循 SQL PSM(持久化存储模块)。例如,让我们定义一个实例方法 Age()
,该方法返回员工的年龄:
CREATE METHOD Age()
RETURNS INTEGER
FOR Employee
BEGIN
RETURN EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM SELF.BirthDate);
END;
在 SQL 查询分析器窗口中执行该语句,然后尝试下一个 SELECT
查询:
SELECT * FROM Employee emp WHERE emp.Age() > 40;
当然,Age()
方法适用于 Employee
和 Manager
。您可以重写 Manager
的方法,并像在 .NET 中一样享受多态行为。
下一篇文章
在本文中,我简要介绍了 Matisse 的 SQL 编程,其中展示了继承和关系等对象特性。在下一篇文章中,我将详细介绍每个主题,并讨论技术上的优缺点。
历史
- 2004 年 6 月 15 日:初始版本
许可证
本文未明确附加许可证,但可能包含文章文本或下载文件本身的使用条款。如有疑问,请通过下方的讨论区联系作者。作者可能使用的许可证列表可以在此处找到。