我是一个相当缺乏经验的初级开发人员,为德国的一家创业公司工作。我目前正在重构一个高度分散的代码库,试图优化设计有点...设计通用数据库模型的数据访问层
问题
在实现数据访问层,我们可以选择跟随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。
问题
是否有任何既定的做法来处理这种情况?我如何设计对通用数据库模型的数据访问?有人应该遵循的模式吗?
预先感谢您!