Db设计用于数据更新批准

时间:2011-04-20 08:51:48

标签: sql sql-server database-design architecture

我正在开展一个项目,我们需要让某些用户输入或更新的数据在添加到“实时数据”之前处于待处理状态。

在准备数据的同时,用户可以保存不完整的记录。虽然数据处于待定状态,但我们不希望数据影响对编辑实时数据的用户施加的规则,例如在输入已处于挂起状态的相同数据时,处理实时数据的用户不应该遇到唯一的约束。

我设想将数据更新集合分组为“数据提交”,当有人质量控制提交时,数据将被重新验证并更正/拒绝/批准。

我考虑了两种关于存储数据的方案:

1)将待处理状态数据保存在与实时数据相同的表中,但添加一个标志以指示其状态。我可以在这里看到问题,必须删除约束或使必需字段可以为空以支持“不完整”状态数据。然后是如何处理更新现有数据的问题,您必须为更新添加新行并将其链接回现有的“实时”行。这对我来说似乎有些混乱。

2)添加镜像活动表的新表,并将数据存储在那里,直到它被批准为止。这将允许我完全控制现有的活动表,而“待定”表可以被用户认为他想放在那里的任何东西滥用。这样做的缺点是我最终会在数据库中添加许多额外的表/ SP。我想到的另一个问题是用户如何在两条记录之间进行链接,其中链接的记录可能是活动表中的记录,也可能是挂起表中的记录,但我想在这种情况下你总是可以获取一份链接记录并将其视为更新?

这两种解决方案似乎都不完美,但第二种似乎对我来说是更好的选择 - 是否有第三种解决方案?

4 个答案:

答案 0 :(得分:2)

你的选择2非常听起来像是最好的主意。如果您想使用参照完整性以及使用DBMS获得的所有好处,则不能在同一个表中拥有待处理数据。但是没有必要存在非结构化数据 - 待处理数据仍然是结构化的,并且可能您希望数据库在执行规则时发挥作用,即使对这些数据也是如此。即使您没有,未决数据也很适合标准表结构。

一组单独的表听起来是正确的答案。您可以将要更改的行的主键放入挂起的表中,以便了解正在编辑的项目或链接到的项目。

我不完全了解你的情况,所以这可能不合适,但一个想法是有一个单独的表来存储正在进行的批量编辑,因为那样你就可以质量控制批次,或者提交一批生活。每个挂起的表都可以有一个批处理键,因此您可以知道它所属的批处理。您必须找到一种方法来控制对同一行的多个挂起编辑(如果您愿意),但这似乎不是一件难以解决的问题。

我不确定这是否合适,但可能值得研究“主数据管理”工具,例如SQL Server的主数据服务。

答案 1 :(得分:1)

'Unit of work'是“数据提交”的好名称。

您可以将其序列化到其他位置,例如(非关系型)面向文档的数据库,并且仅在批准时保存到关系数据库。

取决于仍需要将多少实时数据约束应用于未批准的数据。

答案 2 :(得分:0)

我认为第二种选择更好。要对此进行管理,您可以使用包含两个表的View,并且可以通过视图使用此结构。


另一个好方法是在单独的表中使用XML列来存储必要的数据(因为未知的数量/列的名称)。您只能使用XML列创建一个表广告列“类型”确定与此文档相关的表格。

答案 3 :(得分:0)

第一个场景似乎很好。 在表中添加Status列。没有必要删除Nullable约束只需添加一个函数来检查基于标志的必填字段如果flag为1(不完整)则允许Null否则不允许。 关于第二个疑问,您想要附加数据还是更新整个数据。