我是一個相當缺乏經驗的初級開發人員,爲德國的一家創業公司工作。我目前正在重構一個高度分散的代碼庫,試圖優化設計有點...設計通用數據庫模型的數據訪問層
問題
在實現數據訪問層,我們可以選擇跟隨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。
問題
是否有任何既定的做法來處理這種情況?我如何設計對通用數據庫模型的數據訪問?有人應該遵循的模式嗎?
預先感謝您!