我一直在尝试通过阅读Martin Fowler 的企业应用程序架构模式来了解有关设计模式的更多信息.我遇到了表数据网关模式,并想知道如果你有涉及多个表的操作,你如何使用它?
我的理解是每个表都有自己的类.每个类都有用于访问单个表的SQL语句,但是当我的一些语句依赖于其他表时会发生什么?
这是一个具体的例子.如果我在两个表之间有一对多的关系,例如Questions和Choices(多项选择题),并且想要检索一个包含所有选项的问题.然后我会有一个QuestionGateway带有方法的类,find()但是我还有一个ChoiceGateway带有方法的类findByQuestionId()来检索问题的所有选择吗?
我建议更灵活地解释这种模式。您不应该仅仅为了 100% 与模式定义兼容而感到受到限制或做出奇怪的决定。
请不要误会我的意思。我并不是建议抛弃模式。我实际上建议的是以正确的方式使用它们。
回答你的问题:
ChoiceGateway那么QuestionGateway分开也是很正常的。QuiestionView例如调用它。通过这种方式,您的业务逻辑可能会更加清晰,并且所有数据库特定的内容都将封装在定义的视图中。基本上,这都是关于有用的抽象。如果您习惯使用这些表,则可以独立定义具有一些潜在重复的独立网关。如果您需要“一切都在一个地方”,只需定义一些高级视图抽象即可。
顺便说一句,模式本身不仅抽象表,还抽象视图。因此,我认为您没有理由不能使用定义的方法创建更高级别的抽象。
表数据网关保存用于访问单个表或视图的所有 SQL
您对这种模式的看法是正确的。您的问题表明您还掌握了该模式要解决的问题类型的更重要概念。
表数据网关模式不适用于相关数据存储在多个表中的复杂数据模型。它适用于与数据库中任何其他数据没有关系的简单数据。这是专用键值存储时代之前的倒退,当时人们希望享受对关系模型没有用的数据的 ACID 保证。正如您所注意到的,一旦您关心数据之间的关系,模式就会降级。如果您想象自己想要将JOIN这张桌子与另一张桌子放在一起,请不要使用此模式。由于关系模型的全部目的是保留数据之间的关系,因此在实践中通常会避免这样做。