数据库实体及其依赖关系与本地信息。正确的设计?

时间:2010-11-29 11:27:13

标签: design-patterns

很抱歉这个古怪的标题,我需要仔细解释,以澄清我的意思。

假设我有一个数据库(用作普通集合),其作用是保存一组对象并按需返回它们。例如,我有一个FooDatabase,其中包含Foo类型的对象。这些Foo对象是在FooDatabase的协调下从文件加载的。

现在,必须将其他信息存储在Foo对象中。此附加信息在文件中不可用,但它与每个Foo相关。从技术上讲,如果这些信息在每个Foo的责任范围内都是自我详细的,那么就没有真正的问题:每个Foo都会计算信息并将其存储在自身上。

不幸的是,我的情况更复杂:这些信息不仅取决于主题上的Foo,还取决于存储在数据库中的其他一些Foo对象。我有两种可能来解决这个问题:

  1. 我将数据库本身传递给Foo对象,以便Foo可以查询数据库以查找计算信息所需的其他Foo对象
  2. 我将计算此信息的责任委托给数据库对象,这是唯一能够看到“整个图片”的对象。一旦为每个Foo计算了信息,它就会被数据库推送到每个Foo中。 Foo对象会保留虚拟信息,直到发生这种情况。
  3. 您是否已经遇到过这个问题,这种情况的商定设计是什么?

1 个答案:

答案 0 :(得分:0)

你所谓的数据库我看到的类似于Repository Pattern的东西将为操作提供一个接口,用于从底层数据存储查询给定的Foo。 Foo对象只是保存数据并提供检索数据的方法。根据我的经验,根据您需要相关Foo对象的频率,您有两个选项可供应用。

选项1:构建器

如果您需要它们,大部分时间都会使用Builder Pattern来处理这种情况。您有一个FooBuilder,它使用数据库提供的操作来查询数据库并在Foo对象上填充所需的数据。只要你需要一个特定的Foo,你就可以调用Builder,它可以生成一个完全填充的Foo供你使用。

选项2:延迟加载

如果您不经常需要相关的Foo数据,则可以实施延迟加载解决方案。这可以使用State Pattern完成。为了实现这一点,你在FooBuilder上有一个方法BuildUnfilledFoo,它只加载初始Foo并提供UnfilledState。 UnfilledState通过首先通过获取所需的其他Foos来替换自身,然后调用FilledState来执行操作,从而实现需要附加数据的方法。

以下是我对您提出的其他选项的看法:

将数据库本身传递给Foo对象

  • 正如您在评论中指出的那样,您将在应用程序中引入循环依赖。
  • 您的数据对象取决于您的数据库实现,这将使将来更改数据实施变得更加困难。

将计算此信息的责任委派给数据库

  • 这使得数据库成为与数据对象构造相关联的业务逻辑的所有者,而它实际上应该只处理数据查询