Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于数据更新审批的数据库设计_Sql_Sql Server_Database Design_Architecture - Fatal编程技术网

Sql 用于数据更新审批的数据库设计

Sql 用于数据更新审批的数据库设计,sql,sql-server,database-design,architecture,Sql,Sql Server,Database Design,Architecture,我正在做一个项目,我们需要让一些用户输入或更新的数据在被添加到“实时数据”之前经过挂起状态 在准备数据时,用户可以保存不完整的记录。当数据处于挂起状态时,我们不希望数据影响对编辑实时数据的用户施加的规则,例如,处理实时数据的用户在输入已处于挂起状态的相同数据时不应遇到唯一的约束 我设想,当有人对提交进行质量控制时,数据更新集将被分组为“数据提交”,数据将被重新验证和更正/拒绝/批准 关于存储数据,我考虑了两种情况: 1) 将挂起状态数据保留在与活动数据相同的表中,但添加一个标志以指示其状态。在这

我正在做一个项目,我们需要让一些用户输入或更新的数据在被添加到“实时数据”之前经过挂起状态

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

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

关于存储数据,我考虑了两种情况:

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

2) 添加镜像活动表的新表,并将数据存储在其中,直到其获得批准。这将允许我保持对现有活动表的完全控制,而“挂起”表可能会被用户认为需要放在其中的任何内容所滥用。这样做的缺点是,我最终会在数据库中有很多额外的表/SP。我考虑的另一个问题是,用户如何在两个记录之间进行链接,其中链接到的记录可能是活动表中的一个记录,也可能是挂起表中的一个记录,但我想在这种情况下,您可以始终获取链接记录的副本并将其视为更新

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

是“数据提交”的好名字

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


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

我认为第二个选项更好。要管理这一点,可以使用包含这两个表的视图,并且可以通过视图使用此结构



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

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

您的选项2听起来非常像是最好的主意。如果您想使用引用完整性以及DBMS带来的所有好处,那么不能将挂起的数据放在同一个表中。但是不需要非结构化数据——挂起的数据仍然是结构化的,您可能希望db在强制执行规则方面发挥作用,即使是在这些数据上。即使没有,挂起的数据也很适合标准表结构

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

我不清楚您的具体情况,所以这可能不合适,但一个想法是使用一个单独的表来存储正在进行的编辑批次,因为这样您就可以控制批次的质量,或者提交批次以供使用。每个挂起的表都可以有一个批处理键,以便您知道它是哪个批处理的一部分。您必须找到一种方法来控制对同一行的多个挂起的编辑(如果您愿意的话),但这似乎不是一个很难解决的问题

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