介紹matisse--專為.net的后關(guān)系型數(shù)據(jù)庫part 1 介紹
當我開始接觸用于.net的數(shù)據(jù)庫,我發(fā)現(xiàn)除了眾所周知的一些數(shù)據(jù)庫,如sql server、mysql以外,還有不少選擇。matisse就是其中之一,它是一種后關(guān)系型數(shù)據(jù)庫(post-relational database)。
為什么要選擇matisse呢? 那是因為它是我所知道的,唯一專為.net進行擴充,具有全部的對象性能和原生.net支持的數(shù)據(jù)庫。它主要的性能包括用戶自定義類型,繼承,多態(tài)和簡單的數(shù)據(jù)模型等。過去的兩年里,我在多個需要復雜數(shù)據(jù)模型的.net項目中獲取了matisse的實際工作知識。
如果有人想要找一篇詳盡的文章,能夠?qū)χ髁鞯年P(guān)系型數(shù)據(jù)庫和其他產(chǎn)品進行深層次的比較。我還沒有看到一個簡單的,漸進的教程,能幫助那些希望能夠接觸新一代數(shù)據(jù)庫的開發(fā)人員 。因此,我決定發(fā)布一系列的短文去填補這一空白,這是第一篇文章。
這第一篇文章主要是對用matisse進行sql編程作一個簡介。接下來的文章里,將更加詳細的介紹如何使用.net 和 asp.net去開發(fā)數(shù)據(jù)庫應用程序。
安裝
安裝matisse非常的簡單和快速. 進入matisse下載站點 http://www.matisse.com/developers/downloads/,并在"matisse dbms 7.0.x"區(qū)中下載下面兩個文件:
1. intel - ms windows (文件名是 matisse70x.exe)
2. .net binding (文件名是 matissedotnet70x.exe)
第一個文件安裝數(shù)據(jù)庫服務、管理和開發(fā)工具以及一個通用的客戶端鏈接庫,該鏈接庫可為不同的語言共享,比如c#, vb.net等。第二個文件包含一個.net的裝配件(assembly),其提供對象永久化服務和一個原生的ado.net提供者。
譯者注:在這里,我把native ado.net data provider翻譯為原生的ado.net提供者.
要安裝matisse,你需要擁有windows 系統(tǒng)管理員級別(administrator)的權(quán)限, 機器的基本配置:windows nt, 2000, 或者xp, 64mb內(nèi)存以及100mb的硬盤空間。首先,執(zhí)行matisse70x.exe文件,跟隨安裝向?qū)У闹敢敵霈F(xiàn)安裝類型時,記得選擇"typical/full",安裝過程將在幾分鐘內(nèi)結(jié)束。接著,執(zhí)行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
你也可以在以下網(wǎng)址找到一些編程,數(shù)據(jù)庫管理和安裝方面的指引:
http://www.matisse.com/developers/documentation/.
如果有rational rose建模工具,你也可以下載matisse rose link(matisseroselink70x.exe)。它允許你使用uml來定義和維護數(shù)據(jù)庫schema。
記住,你也可以在linux上面運行你的database服務器,然后在windows上發(fā)布你的.net應用程序。你只需要下載linux版的matisse(matisse-7.0-x.i386.rpm)并用rpm安裝,如果你使用的是redhat 8,在運行rmp之前,你需要修改環(huán)境變量rpm_install_prefix 為/usr/local/matisse。
> rpm -ihv matisse-7.0-x.i386.rpm
使用matisse enterprise manager你可以做什么?
在開始寫一個演示程序之前,讓我們看一些enterprise manager的有趣特性。
1. 你可以象其他那些收費軟件一樣,瀏覽一個數(shù)據(jù)庫中的類,屬性,關(guān)系和sql方法。其中一個有趣的特性,你可以看到一個類的所有屬性(比如屬性,關(guān)系和方法)以及子類的屬性。這樣,當你在類中寫一個sql聲明的時候,這個特性就變得很有用,因為你不用在父類和子類之間來回切換,以查找某一個屬性。
2. 數(shù)據(jù)倒入(csv)
使用csv(comma-separated)文件,你可以從關(guān)系型數(shù)據(jù)庫中倒入數(shù)據(jù)。當你從csv文件倒入數(shù)據(jù),文件中的每一行被存為一個數(shù)據(jù)對象。所有的csv文件倒入結(jié)束后,你需要定義一個描述數(shù)據(jù)庫中不同對象之間鏈接關(guān)系的xrd文件(xml relationship definition)。隨后根據(jù)你uml中的描述,數(shù)據(jù)庫中的對象被整合成一個有意義的語義網(wǎng)絡。對象之間的關(guān)系會在sql查詢時,提供一個明顯的性能優(yōu)化。
簡單演示
在這篇文章中,我將會展示一個簡單的演示應用程序,以介紹如何使用sql去定義一個schema和操作數(shù)據(jù)對象。在接下來的文章中,我們會進行更深入的討論。
首先,你需要開啟一個數(shù)據(jù)庫。執(zhí)行enterprise manager,選中一個數(shù)據(jù)庫,然后點選start菜單。幾秒鐘之后,數(shù)據(jù)庫將被啟動。
在這個演示程序中,我們將使用項目管理模式。其中定義了三個類:project, employee和manager。其關(guān)系如下:
如果有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
);
要執(zhí)行上面的ddl statement,復制到sql query analyzer窗口,執(zhí)行。
到此,你應該看到了用matisse進行數(shù)據(jù)庫建模的優(yōu)點了吧!你不需要改動你的模式,所有的類和其他的容器之間的關(guān)系已經(jīng)被保留在數(shù)據(jù)庫的schema中了。對于維護和擴展應用程序,這是一個很大的優(yōu)勢。
現(xiàn)在,我們可以在數(shù)據(jù)庫中建立對象了。在sql query analyzer窗口中執(zhí)行下面的代碼:
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));
上面的代碼創(chuàng)建了兩個employee對象,一個manager對象,一個project對象。然后將這個兩個雇員對象作為成員加入項目對象中,而經(jīng)理對象作為項目的管理者加入。
要察看插入的對象,執(zhí)行"select * from employee"語句
當你按照employee查找,查詢會返回兩種類的對象-employee 和 manager。因為它們都繼承至類employee。但是,manager對象中的一些屬性,比如title是不會顯示在結(jié)果表中的,因為這些屬性并沒有包括在類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窗口中執(zhí)行上述語句,然后試試下面的查詢語句。
select * from employee emp where emp.age() > 40;
age()這個方法在employee中定義,其子類manager也繼承了這一方法,當然,你也可以象在.net一樣使用它,比如在manager類中覆寫這個方法,或者使用它的多態(tài)特性。
下一篇文章
在這篇文章中,我簡單的介紹了使用matisse進行sql編程,并展示了它的對象特性,比如繼承和關(guān)系。在接下來的文章中,我將更加詳細的逐個介紹,并討論它的技術(shù)優(yōu)勢和劣勢。