2014-06-10 361 views
2

我是一個相當缺乏經驗的初級開發人員,爲德國的一家創業公司工作。我目前正在重構一個高度分散的代碼庫,試圖優化設計有點...設計通用數據庫模型的數據訪問層

問題

在實現數據訪問層,我們可以選擇跟隨DAO模式的原則。只要我們處理的實體相當具體(例如,用戶,發票,賬戶等),這就可以很好地工作。 但是,當我們有一個更通用的數據庫模型時,我們可能經常會覺得需要查詢由多個表組成的特定結果集。通常我們不應該明白哪個數據訪問對象應該分配查詢方法。

採取OSM(openstreetmap.org)數據庫:有效恰好有節點,方式和關係,使許多不同的對象的表示(如街道,建築物,交通標誌等) 。當詢問舒適性時,它可以由單個節點(單點,例如紀念物),方式(路徑,可以說博物館的輪廓)或方式集合(例如大學校園的建築物)來表示。

除此之外,我可能只會對可用信息的一小部分感興趣,並且可能是開銷來獲取完整的實體。或者我可以在我的查詢中使用特定於數據庫的函數,這會導致從底層實體模型中進一步抽象出來的結果。

我給你在代碼的一個例子(在Java中,利用彈簧的框架儲存庫接口):

public class IWayRepository extends Repository<Way, Long> { 
    ... 
    @Query(value = "select distinct ways.tags->'addr:interpolation' as type," 
     + "trim(both '{}' from text(ways.nodes)) as nodes from nodes, way_nodes, ways " 
     + "where nodes.tags->'addr:street'=? and way_nodes.node_id=nodes.id " 
     + "and ways.id=way_nodes.way_id " 
     + "and st_intersects(st_geometryfromtext(?,4326),nodes.geom)" 
     + "and exist(ways.tags,'addr:interpolation')=true", nativeQuery = true) 
    List<Map<String, Object>> findAdressInterpolationInfoForStreetInBbox(String street, 
     String bbox); 
    ... 
} 

在多個表中的代碼的查詢,塗改數據與數據庫層,並返回上的功能數據的提取物幾乎不適合給定實體的域。

理念

爲了提高設計有未來兩個選項來我的腦海裏現在。

  • 組成一個更具體的數據訪問類:AddressRepository,我訪問裸露的結果集。但我不太喜歡這個想法。
  • 組成更通用的Service類:例如LocalizationService。

問題

是否有任何既定的做法來處理這種情況?我如何設計對通用數據庫模型的數據訪問?有人應該遵循的模式嗎?

預先感謝您!

回答