0

我有一个数据库,可以在不同的表中存储不同类型的任务和更多项目。在许多这些表中(它们的结构不同)我需要一种方法来做到这一点,该项目必须被仔细检查,这意味着该项目不能被“保存”(我的意思是它当然会被保存)在其他人进入程序并确认之前。

什么是确认哪个项目的正确说法:

  1. 这些表中的每一个都应该有一个“IsConfirmed”列,然后当那个人想要确认所有的东西时,程序会遍历所有的表并创建一个未检查项目的列表。
  2. 应该有第三个表,其中包含必须确认的该行的表名和 Id。
  3. 我希望你比上面的两个丑陋的想法更好。
4

2 回答 2

2

双重确认状态是否对实体仅发生一次?还是可以拒绝,需要重新确认?在后一种情况下,您是否需要保留所有这些历史记录?您是否需要跟踪每次确认的人(例如,这样您就不会让同一个人执行两次确认)?

简单案例:

ALTER TABLE dbo.Table ADD ConfirmCount TINYINT NOT NULL DEFAULT 0;
ALTER TABLE dbo.Table ADD Processed BIT NOT NULL DEFAULT 0;

第一次确认时:

UPDATE dbo.Table SET ConfirmCount = 1 WHERE PK = <PK> AND ConfirmCount = 0;

第二次确认:

UPDATE dbo.Table SET ConfirmCount = 2 WHERE PK = <PK> AND ConfirmCount = 1;

被拒绝时:

UPDATE dbo.Table SET ConfirmCount = 0 WHERE PK = <PK>;

现在显然您的后台作业只能处理 Processed = 0ConfirmCount = 2 的行。然后当它处理该行时:

UPDATE dbo.Table SET Processed = 1 WHERE PK = <PK>;

如果您有比这更复杂的情况,请提供更多详细信息,包括双重确认流程的目标。

于 2009-10-18T22:08:47.170 回答
1

考虑添加一个新表来保存要确认的记录(例如 TasksToBeConfirmed)。确认记录后,将这些记录移至永久表(任务)。

添加“IsConfirmed”列的缺点是几乎每个使用该表的 SQL 语句都必须过滤“IsConfirmed”以防止获得未经确认的记录。每次错过这一点,就会引入一个缺陷。

如果您需要确认和未确认的记录,请使用 UNION。

这种模式在编码和实现方面需要做更多的工作,但根据我的经验,它显着提高了性能并减少了缺陷。

于 2009-10-20T12:14:25.270 回答