我幾乎完成了我的數據映射器,但現在我處於關係關係的階段。數據映射器和關係:實施策略?
我會盡力在這裏說明我的想法。我無法找到關於這個主題的好文章/信息,所以也許我正在重新發明輪子(當然,我可以使用一個大框架 - 但我想通過這樣做來學習)。
1:1間的關係
首先,讓我們來看看1:1的關係。一般來說,當我們有一個名爲「Company」的域類和一個名爲「Address」的域類時,我們的公司類將具有類似address_id的內容。可以說,在大多數情況下,我們只顯示一個公司名單,只有當有人查看細節時才需要地址。在這種情況下,我的Data Mapper(CompanyDataMapper)只是簡單地加載,意味着它只會從數據庫中獲取address_id,但不會進行連接以獲取地址數據。
一般來說,我有一個每個關係的getter方法。所以在這種情況下,有一個getAddress(公司companyObject)方法。它需要一個公司對象,查找它的地址屬性,如果它是NULL,則從數據庫中獲取相應的Address對象,使用該Address對象的Mapper類(AddressDataMapper),並將該地址對象分配給指定的地址屬性公司對象。
重要提示:數據映射器是否允許使用其他數據映射器?
可以說在大多數情況下,您需要公司對象和地址對象,因爲您總是一起顯示它在一個列表中。在這種情況下,CompanyDataMapper不僅獲取公司對象,而且通過JOIN執行SQL查詢以獲取地址對象的所有字段。最後,它遍歷記錄集併爲新對象提供相應的值,並將地址對象分配給公司對象。
聽起來很簡單,到目前爲止。
1:N的關係
這些怎麼樣?與1:1唯一的區別是,公司可能有多個地址對象。讓我們看看:當我們大多數時間只對公司感興趣時,Data Mapper會將公司對象的地址屬性設置爲NULL。地址屬性是可以引用無,一個或多個地址的數組。但是我們還不知道,因爲我們懶洋洋地加載,所以它只是NULL。但是,如果我們在大多數情況下需要所有的地址,那又如何呢?如果我們將所有公司的大名單連同他們的所有地址一起顯示?在這種情況下,事情開始變得非常難看。首先,我們不能爲每個地址對象加入地址表五十次(我堅信這是不可能的,如果是的話,性能會低於零)。所以,當我們進一步思考這個問題時,在這種情況下不可能不加載。
重要提示:這是真的嗎?我必須發送100個查詢才能獲得100個地址對象,如果我有10家公司,每個地址有10個地址?
M:N的關係
比方說一個地址對象只包含國家,州,城市,道路和門牌號碼。但是,一間房子可能是一個大型商業大廈,其中有很多公司。就像那些現代化的辦公大樓之一一樣,任何人都可以租用一個小型的ROM來炫耀它的網站上的塔。所以:許多公司可以共享相同的地址。
我還沒有計劃來處理這類問題。
重要提示:也許這不是比1一個更大的問題:N的關係?
如果有誰知道一個良好的ressource即進入關於解決/實現這個細節,我會很高興的鏈接!