您如何使用涉及一对多关系的表数据网关模式?

Mik*_*key 5 design-patterns

我一直在尝试通过阅读Martin Fowler 的企业应用程序架构模式来了解有关设计模式的更多信息.我遇到了表数据网关模式,并想知道如果你有涉及多个表的操作,你如何使用它?

我的理解是每个表都有自己的类.每个类都有用于访问单个表的SQL语句,但是当我的一些语句依赖于其他表时会发生什么?

这是一个具体的例子.如果我在两个表之间有一对多的关系,例如QuestionsChoices(多项选择题),并且想要检索一个包含所有选项的问题.然后我会有一个QuestionGateway带有方法的类,find()但是我还有一个ChoiceGateway带有方法的类findByQuestionId()来检索问题的所有选择吗?

Ren*_*nov 5

我建议更灵活地解释这种模式。您不应该仅仅为了 100% 与模式定义兼容而感到受到限制或做出奇怪的决定。

请不要误会我的意思。我并不是建议抛弃模式。我实际上建议的是以正确的方式使用它们。

回答你的问题:

  • 如果你们之间没有那么多的相互依赖,ChoiceGateway那么QuestionGateway分开也是很正常的。
  • 如果存在相互依赖性,并且最好从业务逻辑角度“连接”这些表,您可以创建类似“视图”的东西,QuiestionView例如调用它。通过这种方式,您的业务逻辑可能会更加清晰,并且所有数据库特定的内容都将封装在定义的视图中。

基本上,这都是关于有用的抽象。如果您习惯使用这些表,则可以独立定义具有一些潜在重复的独立网关。如果您需要“一切都在一个地方”,只需定义一些高级视图抽象即可。

顺便说一句,模式本身不仅抽象表,还抽象视图。因此,我认为您没有理由不能使用定义的方法创建更高级别的抽象。

表数据网关保存用于访问单个表或视图的所有 SQL


Flo*_*oky 2

您对这种模式的看法是正确的。您的问题表明您还掌握了该模式要解决的问题类型的更重要概念。

表数据网关模式不适用于相关数据存储在多个表中的复杂数据模型。它适用于与数据库中任何其他数据没有关系的简单数据。这是专用键值存储时代之前的倒退,当时人们希望享受对关系模型没有用的数据的 ACID 保证。正如您所注意到的,一旦您关心数据之间的关系,模式就会降级。如果您想象自己想要将JOIN这张桌子与另一张桌子放在一起,请不要使用此模式。由于关系模型的全部目的是保留数据之间的关系,因此在实践中通常会避免这样做。