【问题标题】:Db design for data update approval用于数据更新审批的数据库设计
【发布时间】:2011-08-09 07:46:49
【问题描述】:

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

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

我设想将数据更新集分组到“数据提交”中,当有人对提交进行质量控制时,数据将被重新验证和更正/拒绝/批准。

关于存储数据,我考虑过两种方案:

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

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

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

【问题讨论】:

    标签: sql sql-server database-design architecture


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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


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

        【讨论】:

          【解决方案4】:

          第一个场景似乎不错。 在表中添加 Status 列。无需删除 Nullable 约束,只需添加一个函数来根据标志检查所需字段,例如 If flag is 1(incomplete) 允许 Null 否则不允许。 关于第二个疑问,您是要追加数据还是更新整个数据。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-25
            • 2013-01-29
            • 1970-01-01
            • 2011-01-02
            • 1970-01-01
            • 2010-12-14
            • 2016-11-26
            • 2018-10-02
            相关资源
            最近更新 更多