2014-06-10 170 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。

问题

是否有任何既定的做法来处理这种情况?我如何设计对通用数据库模型的数据访问?有人应该遵循的模式吗?

预先感谢您!

回答