关闭。这个问题需要更多 focused .它目前不接受答案。
想改进这个问题?更新问题,使其仅关注一个问题 editing this post .
5年前关闭。
Improve this question
我是一个相当缺乏经验的初级开发人员,在德国的一家初创公司工作。我目前正在重构一个高度分散的代码库,试图稍微优化设计......
问题
在实现数据访问层时,我们可以选择遵循 DAO 模式的原则。只要我们处理的实体相当具体(例如,用户、发票、帐户等),这种方法就可以很好地工作。
但是当我们有一个更通用的数据库模型时,我们可能经常觉得需要查询由多个表组成的特定结果集。通常我们应该将查询方法分配给哪个数据访问对象并不明显。
示例
以 OSM (openstreetmap.org) 数据库为例:实际上只有节点、方式和关系构成了许多不同对象(如街道、建筑物、交通标志等)的表示。当查询便利设施时,它可能由单个节点(单个点,例如纪念馆)、路径(路径,可以说博物馆的轮廓)或路径集合(例如大学校园的建筑物)表示。
除此之外,我可能只对可用信息的一小部分感兴趣,而且获取完整实体可能会产生开销。或者我可以在我的查询中使用特定于数据库的函数,这会导致从底层实体模型中进一步抽象的结果。
我给你一个代码示例(在 java 中,使用 spring-frameworks 存储库接口(interface)):
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);
...
}
代码查询多个表,使用数据库层上的函数更改数据,并返回几乎不适合给定实体域的数据提取。
理念
为了改进设计,我现在想到了两种选择。
问题
是否有任何既定的做法来处理这种情况?如何设计对通用数据库模型的数据访问。有没有应该遵循的模式?
先感谢您!
最佳答案
您可以利用管理器(即 mediator)设计模式的解决方案。你可以有多个 DAO 类和一个管理器来控制它:http://tutorials.jenkov.com/java-persistence/dao-manager.html .正如您所指出的那样,管理器提供对将要使用的 DAO 的访问权限,介于更具体或通用的 DAO 之间。
关于java - 为通用数据库模型设计数据访问层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144477/