假设我想将所有客户(或某些其他特定表中的所有行)导入某个外部系统。在数据库中创建它们之后,不是一次全部,而是每一个。为此,我必须记录已经报告的所有行,因为我只想查找尚未报告的行。通常最好添加一个列来创建或创建某种批处理日志表吗?
如果相关,我正在使用MS SQL Server
简化示例:
从Customer中选择*,其中reportedToExternalSystem为空
或
从客户中选择*,其中cus_id不在(从integrationBatchLog中选择cus_id)
或者可能还有更多方法可以做得更好?这是我第一次这样做,所以我还不知道最佳做法。
答案 0 :(得分:1)
除非您 使实施复杂化,否则请尽可能使用最简单的解决方案。你应该考虑的一件重要的事情是,如果你需要的话,将这个简单的重构为更普遍的是多么困难。
在您的情况下,我发现从列到表升级只有一个问题。如果您需要进口历史记录。解决方案:将DateTime(或Timestamp)类型的reportedToExternalSystem
列设为
答案 1 :(得分:1)
简单的解决方案是添加一个将行标记为已导入的列。状态int(0/1)或者如果要跟踪导入日期的时间。这个解决方案确实有一些限制:
您只能导入一次行。更新记录时是否需要再次导入客户?您是否要在更新客户时清除更新字段?
更新行状态时会导致行被锁定。您确定插入客户记录的应用程序会对锁定记录的代码感到满意吗?
在某些系统上,它会将整行写入日志系统进行恢复。根据行的大小,这可能只是一个字段的大量日志写入。
在高度并行的导入系统中,您可能会争夺很多资源。如果一个导入程序锁定了表,那么想想如果许多导入程序同时锁定表有多糟糕。
如果客户数据在导入轮询间隔之间多次更新,您将只看到最新数据并跳过中间更新。如果您关心中间体更新,这只是一个问题。对于您可能不关心的客户,对于订单状态,您可能会非常关心。
您必须修改表结构。由于数据/支持/政治问题,源应用程序可能不允许这样做。
除了在表中放置状态列之外,一种运行良好的技术是在表上放置一个触发器并将导入数据镜像到第二个表。然后,您将“使用”第二个表中的数据。这有几个好处:
它将锁定问题包含在第二个表中。
它允许您处理主表的每次更新。
您可以在第二个表中添加索引,用于跟踪更新状态,而不会出现更改主表的问题。
如果您删除第二个表中的行(无论是在消费时还是在短暂的审核期后),表/索引的大小都会达到最小值。
当我在Sql Server中使用这种技术时,我把第二个表放在一个单独的模式中。由于大多数应用程序将其表存储在dbo中,因此您最终可以使用dbo.Customers和Import.Customers。这可以帮助您跟踪要导入的表,并使您不必为导入表创建新名称。
答案 2 :(得分:0)
我会使用一个单独的表来表示,例如,导入日期交叉引用您正在跟踪的表中记录的键。换句话说,一个包含3列的表:auto-increment key,record-id-from-other-table,import-date。这样的事情。如果以后重新导入记录,这也允许这种情况。您可以按日期跟踪所有导入。
答案 3 :(得分:0)
我更喜欢column for importing status
。维护单独的日志会导致耗时的结果,表格大小不断增加。我对SQL Server有概念性的想法,但似乎它有效。继续发帖!