數(shù)據(jù)庫對(duì)象關(guān)系映射是目前非;馃岬臄(shù)據(jù)庫訪問技術(shù)。這又是一門“偉大"

的技術(shù),實(shí)在有點(diǎn)博大精深了。有興趣的話,可以自行搜索一下。
Mdtypes只是提供了一個(gè)Freebasic版的數(shù)據(jù)庫對(duì)象關(guān)系映射的基本雛形。但它簡(jiǎn)單實(shí)用,雖然它無法象Entity Frame,或java的ORM那么牛逼哄哄,不過你也不用深陷偉大技術(shù)的偉大泥潭的苦惱。
對(duì)于經(jīng)常使用vba的人來說,如果不使用recordset,那么數(shù)據(jù)庫離你大概有十萬八千里遠(yuǎn),因?yàn)槿绻麤]有recordset,那么很多人根本不知道如何使用數(shù)據(jù)庫。接下來的數(shù)據(jù)庫對(duì)象關(guān)系映射,可能是另一個(gè)全新的方式(其實(shí)是新瓶裝舊酒),這個(gè)沖擊有點(diǎn)大。
接下來是我的粗淺的認(rèn)識(shí),可能會(huì)有很多錯(cuò)誤,甚至理解偏差了,以后隨著越來越深入的了解,可以慢慢改正:
1、數(shù)據(jù)庫對(duì)象的映射:
一個(gè)數(shù)據(jù)庫就是一個(gè)對(duì)象。數(shù)據(jù)庫中有很多表,所有的表構(gòu)成tables。tables就是一個(gè)集合。也有很多存儲(chǔ)過程、很多視圖、關(guān)系,這些都會(huì)構(gòu)成集合。
一個(gè)表本身包含很多行記錄。所有的行記錄也是一個(gè)集合。一行記錄(有很多列,每個(gè)都有列名),一行記錄就構(gòu)成了一個(gè)字典(或map),
其中列名就是key,列值就是value,表現(xiàn)為key=value這樣的形式。所以一張表,實(shí)際上是一個(gè)List表+map的復(fù)合體(所謂的二維表)。
一張表中有很多列,所有的列本身也是一個(gè)集合,每一個(gè)列(字段名)有很多屬性,如數(shù)據(jù)類型等,一個(gè)字段名的所有屬性描述也構(gòu)成了一個(gè)Map。
list和map都是對(duì)象,所以數(shù)據(jù)庫里的對(duì)象,就這樣映射到編程語言中的collection和map對(duì)象來。
2、數(shù)據(jù)庫數(shù)據(jù)類型的映射:每一種數(shù)據(jù)庫都有自己的數(shù)據(jù)類型。而每一種語言也有自己的數(shù)據(jù)類型,所以需要進(jìn)行映射。
3、表與表之間關(guān)系的映射:這是一個(gè)非常蛋疼的話題。因?yàn)閙dTypes中的持久化,還在發(fā)展中,所以這里就不扯。
由于目前mdTypes的持久化,特別是數(shù)據(jù)庫持久化還是基本雛形,所以它的優(yōu)缺點(diǎn)很明顯,而且大部分的缺點(diǎn)是ORM本身就有的
缺點(diǎn):
1、數(shù)據(jù)類型的對(duì)應(yīng):FB的數(shù)據(jù)類型如何與數(shù)據(jù)庫的數(shù)據(jù)類型進(jìn)行快速簡(jiǎn)便地映射,這本身是一個(gè)問題,雖然絕大部分的數(shù)據(jù)類型可以進(jìn)行一一對(duì)應(yīng),但它始終是一個(gè)問題
2、colleciton必須有兩個(gè)構(gòu)造函數(shù),一個(gè)是空的constructor,一個(gè)是帶有參數(shù)的constructor。而FB的構(gòu)造、解構(gòu)函數(shù)是無法繼承。也就是說這代碼只能不厭其煩
地進(jìn)行復(fù)制。同樣的兩個(gè)operator cast()和=也是無法避免。
3、目前還無法避免必須對(duì)數(shù)據(jù)庫表設(shè)計(jì)的深入了解。雖然對(duì)于小項(xiàng)目,這沒什么,但始終是一個(gè)大問題。
4、每次查詢都得定義一次map的結(jié)構(gòu),并進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,這個(gè)工作量不小。(或許會(huì)有更簡(jiǎn)便的方法?)