我每月导入一些来自不同供应商的平面文件,我想跟踪哪些记录来自哪个文件。
目前:
CREATE TABLE Fact.Order
(
Id INT NOT NULL IDENTITY PRIMARY KEY
,OrderId INT NOT NULL
,VendorId INT NOT NULL REFERENCES Vendor (Id)
,OrderTypeId INT NOT NULL REFERENCES OrderType (Id)
,SaleDate DATETIME2 NOT NULL
,Amount MONEY NOT NULL
);
文件追踪表:
CREATE TABLE [File]
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
VendorId INT NOT NULL REFERENCES Vendor (Id)
FileHash BINARY(20) NOT NULL,
FileSize BIGINT NOT NULL,
ModifiedDate DATETIME2 NOT NULL,
FileRecordCount INT NOT NULL,
CreatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
UpdatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
IsDelete BIT NOT NULL DEFAULT 0,
CONSTRAINT UQ_Files_FileHash_IsDelete UNIQUE NONCLUSTERED
(
FileHash,
IsDelete
) WITH (IGNORE_DUP_KEY = ON)
);
CREATE TABLE FileImport
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
FileId INT NOT NULL REFERENCES [File] (Id),
OrderTypeId INT NOT NULL REFERENCES OrderType (Id),
ImportRecordCount INT NOT NULL,
CreatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
UpdatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
IsDelete BIT NOT NULL DEFAULT 0
);
最好将FileImport
密钥保存在Fact.Order
表中,还是将数据放入自己的表中?
编辑:
到目前为止,我决定从VendorId
表中删除File
,现在它只存储有关文件的信息。
然后,我为每个事实表创建了元数据表,其中包含与业务键关联的唯一标识符。
CREATE TABLE File.Order
(
OrderId INT NOT NULL,
VendorId INT NOT NULL,
FileId INT NOT NULL REFERENCES File (Id),
CreatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
UpdatedDate DATE NOT NULL DEFAULT GETUTCDATE(),
IsDelete BIT NOT NULL DEFAULT 0,
CONSTRAINT UQ_File_Order_OrderId_VendorId PRIMARY KEY CLUSTERED
(
OrderId,
VendorId,
FileId
)
)
答案 0 :(得分:1)
我不将FactImport fk存储在Fact.Order表中。它与Fact.Order本身无关。
如果需要定期查询导入记录,则创建另一个记录表。请记住,如果将来修改或删除File.Order记录,您的录制将失去一致性。
如果是历史记录,如果是审计,则登录到文件并将文件保存在其他位置。