2

我需要设计和实现类似于 Martin Fowler 所说的“工作单元”模式的东西。我听说其他人将其称为“购物车”模式,但我不相信需求是相同的。

具体问题是用户(和我们的 UI 团队)希望能够在创建父对象之前创建和分配子对象(在数据库中具有参照完整性约束)。我今天遇到了我们的另一位设计师,我们提出了两种替代方法。

a) 首先,在数据库中创建一个 dummy parent 对象,然后创建 dummy children 和 dummy assignments。我们可以使用否定键(我们的正常键都是肯定的)来区分数据库中的绵羊和山羊。然后当用户提交整个交易时,我们必须更新数据并添加和对齐真正的键。

我看到这个有几个缺点。

  • 它会导致对索引的扰动。
  • 我们仍然需要想出一些东西来满足对具有它们的列的唯一约束。
  • 我们必须修改许多现有的 SQL 和生成 SQL 的代码,以便为许多 WHERE 子句添加另一个谓词。
  • 可以更改 Oracle 中的主键,但这是一个挑战。

b) 为需要能够参与这些反向事务的对象和分配创建瞬态表。当用户点击提交时,我们生成真正的条目并清除旧条目。

我认为这比第一个替代方案更干净,但仍然涉及增加的数据库活动级别。

如果会话在用户执行提交或取消请求之前丢失,这两种方法都要求我有某种方法来使瞬态数据过期。

有没有人以不同的方式解决了这个问题?

在此先感谢您的帮助。

4

1 回答 1

1

我不明白为什么在提交事务之前需要在数据库中创建这些对象,因此您可能需要在继续解决方案之前与您的 UI 团队进行澄清。您可能会发现他们想要做的只是读取用户之前保存在另一个页面上的信息。

所以,假设在提交之前不需要将对象存储在数据库中,我给你计划 C:

在会话中存储初始化的业务对象。然后,您可以创建所需的所有子项,并且仅在需要提交事务时才触及数据库(并设置引用)。如果会话数据将很大(单独或集体),请将会话信息存储在数据库中(您可能已经这样做了)。

于 2009-10-05T17:56:49.680 回答