OODBMS

最近用 OR-mapping library - hibernate 用到有點煩,原因是,為了要處理物件跟表單之間的對映,要需要一些 metadata 來維持其間的關係。

Hibernate 的 OR-mapping configuraiton file 是 XML-based,定義了許多的 tag,如果要用手工的方式產出,那真的是會試到累死。在開發的初期其實界面還不是那麼的穩定,每次一改變 class 的 interface 相關的 mapping configuraiton、database schema 還有 java code 都要改,其中一者改錯了都會造成系統不正常,變數很大。比較輕鬆的方式是用 XDoclet 標明類別與 table(s) 的關聯,接下來再以 ANT + hibernate 提供的 task 來產生 configuration file,不過…用久了還是覺得很麻煩。

前幾天我哥跟我說有個產品可以解決這個問題,它是個 OODBMS,名叫 DB4O。當下我就把它抓下來玩了玩,嗯~有 tutorial、javadoc。還可以支援 java、.Net(M$ + Mono),真的是不錯。

雖然,像 cluster 這種功能它是沒有,但是簡單的 replication 還是有支援的。對於小型的專案,我想它絕對是足夠了。

效能方面,它號稱是超越所有的 RDBMS,這個我想大概應該也不是騙人的。畢竟 RDBMS 的架構本來就是所有資料庫中效能最差的。

管理界面,看它提供的 tutorial 中的圖片,似乎是以 eclipse 的 RCP 為基礎開發的,似乎。但是功能還不是很強,只能瀏覽資料庫中的物件,沒有執行變更,這是它的弱項。

易用性這方面真的是沒話說。資料庫的開啟只要呼叫
Db4o.openFile()
或是
Db4o.openServer()
就可以完成開啟 local file 作為資料庫或是開啟 local file 並 listen 供多個 client 連上。
接下來,如果你要放入物件,只要先 new 它以後再丟給 Db4o 的 ObjectContainer 即可
User user = new User("Derek", "1234");
Role admin = new Role("admin");
user.addRole(admin);
ObjectContainer oc = Db4o.openClient();
oc.set(user);
這樣你的 user 物件就會放進資料庫中了,當然,admin 也會一起進去的,簡單吧!你說 metadata 到哪去了?嗯~忘了它吧!這些事情,Db4o 都會幫你處理好滴!

要從資料庫中拿資料,一樣用的是 pure java object,看下例
User user = new User("Derek", null);
ObjectSet users = oc.get(user);
這樣,Db4o 就會從資料庫裡把名為 Derek 的 user 物件抓出來了,也是粉簡單。

其他的功能像是排序、以特定的 field 值去取物件、like 等功能都是經由 Query 物件來達成的。在整個操作的過程中,完成是以 pure java 來達成的,不需到再去寫什麼 SQL statement 了,非常的簡易及方便。

我想,這樣的開發方式真的才能有產能。一個 web 系統分成那麼多層,如果沒有人力的話,那一個人可能又要搞前端的 HTML + CSS + JavaScript,中間的話可能要搞 Struts + JSP,然後經由 Hibernate 去存取後端的 RMDBMS。這樣的系統搞出來,真的不是很好維護說。

Zope 是個類似 Tomcat 的東東,但是以 Python 寫成的。但是除了提供 web server 及 application framework 外,還有功能強大但易用的 CMS 系統及 Python 完成的 OODBMS。這個 project 已經跑了非常的久了,有許多的站臺也都是 Zope 架成的,所以這種模式已經被證明是可行的了,那,Java 現在有了非官方的 OODBMS 了,什麼時候才會有能跟 Zope 一樣完整的產品出現呢?