sql-server – 在将数据转移到生产环境中时,是否存在非DDL方式来保留反向引用?

假设我有这个假设的架构:

源(OLTP)DB:

Table Orders
------------
OrderID int IDENTITY (PK),
CustomerID int NOT NULL,
OrderAmount decimal NOT NULL

目的地(DSS)数据库:

Table Activity
--------------
ActivityID int IDENTITY (PK),
PersonID int NOT NULL,
Amount decimal NOT NULL

Table ActivityOrderImport
--------------------
ActivityID int NOT NULL,
SourceOrderID int NOT NULL

Table CustomerMapping
---------------------
CustomerID int NOT NULL,
PersonID int NOT NULL

显然,真正的交易更加复杂,有更多的转变.但是暂时假设所有这些ETL都将特定交易(“订单”)从外部实体合并到跟踪通用“活动”的DSS中.外部客户和DSS人员之间的链接位于CustomerMapping表中.

“导入”表的想法是在出现问题时提供某种审计跟踪.我们对源系统没有很多控制权,并且知道它有点不稳定.因此,能够理解任何特定活动的起源对我们来说非常重要.

现在,有一个脚本使用DDL执行此操作,看起来像这样:

ALTER TABLE Activity
ADD OrderID int NULL

MERGE Activity
USING #StagingOrders
(...)

INSERT ActivityOrderImport (ActivityID, SourceOrderID)
SELECT a.ActivityID, s.OrderID
FROM #StagingOrders s
INNER JOIN Activity a
    ON a.OrderID = s.OrderID

ALTER TABLE Activity
DROP COLUMN OrderID

这种方法很好,在不崩溃和燃烧的意义上,每次看DDL都会让我感到恶心.

>永久性地将OrderID列添加到Activity表中确实不是一个选项,因为数据可能来自多个源,每个源当前都需要自己的日志表.在主表中为所有这些添加单独的列会破坏规范化并快速将生产数据库变成狗的早餐.
>从Activity表中删除IDENTITY约束并使用一些自然派生键是一个更好的选择,但由于同样的原因仍然不切实际 – 因为每个系统都有不同的定义方式,我们最终必须使用nvarchar列对于主键(ick).更不用说我们失去了对很多事情很重要的连续性.

所以我一直在想,有没有更好的方法来做到这一点,一个不涉及DDL但仍然考虑到外部密钥的异构性质(因此需要为每个源提供不同的跟踪表)?

我不一定要求只在当前设计下工作的脚本.我意识到设计可能需要修改,我愿意创建更多的表甚至单独的临时数据库;此时我唯一不愿意做的事情是(a)将这些跟踪列添加到基表和/或(b)删除IDENTITY字段.在此处保持关注点分离并将实际活动数据与导入“日志”数据分开是很重要的.

有什么想法,我可以用这个设计来实现这里的所有目标,还是我把自己画成一个角落,并使目前的限制变得不可能?

最佳答案
我建议将一组(一组)登台表添加到目的地或中间人,可以更好地控制和更稳定.将跟踪信息放在那里.然后执行从登台到最终目的地的所有转换,或者随身携带跟踪信息或丢弃它.

有几种方法可以从多个系统生成跟踪密钥,只要它们都遵循相同的算法,它就不必是INT.它可以是带有序号的2字符前缀.就此而言,它不必只是一列.

转载注明原文:sql-server – 在将数据转移到生产环境中时,是否存在非DDL方式来保留反向引用? - 代码日志