我目前正在尝试使用Doctrine改造数据库,但在当前的实现中,表之间并不存在太多的双向关系。这使得难以从任何给定实体遍历对象图。
假设我希望能够在任何给定点开始并遍历整个对象图。通过阅读文档,我可以:
1)使用双向关系字段重建数据库,以便我可以使用正确设置的关联映射进行遍历
2)创建自定义存储库并通过传入各种实体来获取
我很担心在任何地方建立双向关系,但与此同时,创建许多自定义存储库会给我带来不好的感觉。决定使用关联映射与存储库时,经验法则是什么?一个或那个是否有任何性能优势?
答案 0 :(得分:0)
您仍然可以通过使用提取连接构建查询来遍历实体之间的单向关联。这样,相关实体包含在查询返回的水合结果集中。
如果仍然需要在反面更深入地遍历对象图,则可以在查询中添加另一个引用相关联实体的连接。从性能的角度来看,单向提取连接通常比将关联转换为双向更可取,因为这样可以控制加载哪些相关实体以及何时加载。
另请注意,即使您确实将关联转换为双向关联,您实际上并不是“重建数据库”。您只会在关系的反面添加新属性。这不会向数据库本身添加任何新字段。
至于添加/使用自定义存储库,这本身不会给应用程序增加任何开销。自定义存储库只是存储特定于给定实体的查询和其他域逻辑的位置。实际上,在您的存储库类中编写自定义查询可能比仅使用默认存储库方法(例如find()和findAll())进行查询更有效,这些方法会自动加载相关实体,无论您是否需要它们。