1

我有一堆来自不同供应商的平面文件,我每月导入这些文件,我想跟踪哪些记录来自哪个文件。

目前:

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表中还是应该将数据放入自己的表中?

编辑:

到目前为止,我决定VendorIdFile表中删除,所以现在它只存储有关文件的信息。

然后,我为每个包含唯一标识符的事实表创建了元数据表,以与业务键相关联。

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
    )
)
4

1 回答 1

1

不会将 FileImport fk 存储在 Fact.Order 表中。它与 Fact.Order 本身无关。

如果需要定期查询导入记录,则创建另一个日志表。请记住,如果将来修改或删除 File.Order 记录,您将失去记录的一致性。

如果是为了历史记录,在审计的情况下,然后记录到一个文件中,并将该文件保存在其他地方。

于 2013-06-13T21:39:31.813 回答