版本控制独立记录并根据配置列出所有记录

Version control independent records and list them all base on a configuration

我看过这两个问题:

Is there a MySQL option/feature to track history of changes to records?

How to version control a record in a database

我了解版本系统应该如何工作,但我有一个关于我的情况的特殊问题。

例如我有这个 table:

假设这个 table 中有大约 4000 条记录。我将根据预设配置向用户显示一次 100 条记录,例如显示所有 record A 值为 foo.

的记录

用户现在可以更改 100 条记录中的任何一条,例如,假设他更改了 4 条记录,而其他 96 条记录保持不变。

我的问题是:

如果用户仅更改预设配置中的 4 条记录,跟踪更改的最佳方式是什么?除此之外,跟踪配置(100 条记录在更改前的特定日期的样子) .

我可以添加 start_date 和 end_date 字段来跟踪另一个 table 中的配置,但是 table 和用 100 条记录填充它,其中只有 4 条记录发生变化,以便能够知道配置在某个日期的情况以及根据该日期的版本更改了哪些记录。最后,我将得到数百个只有日期字段不同的重复内容。这种情况的理想解决方案是什么?


稍后编辑: 主要思想是获得这样的东西:

我希望能够从特定的创建日期看到每个配置版本(版本 1、2、3、4)。每个配置都包含旧行(来自以前的配置版本)+ 用户在新版本中修改的行。

根据我们的聊天讨论,this link 作为谈话要点,

考虑以下架构并对其进行扩展。

-- drop table bom
create table bom
(   -- Bill of Materials
    bomId int auto_increment primary key
    -- other high level fields
);

-- drop table bomVersion
create table bomVersion
(   -- Bill of Materials / version
    id int auto_increment primary key,
    bomId int not null,
    -- other high level fields
    version int not null, -- you need to figure out how to increment this, and it is not an auto inc here
    description varchar(1000), -- ie: let's add a Floppy Drive
    creationDate datetime not null,
    unique key(bomId,version),  -- no dupes
    -- yes, (bomId,version) could be the PK but I chose not to
    CONSTRAINT fk_version_bom FOREIGN KEY (bomId) REFERENCES bom(bomId)
);

-- drop table bvDetails;
create table bvDetails
(   -- Bill of Materials / Version / Details
    id int auto_increment primary key,
    bvId int not null,
    lineNumber int not null, -- if ordering is important
    partId int not null,
    qty int not null,   --  I am no BOM expert, is this stuff in there?
    price decimal(12,2) not null, --    I am no BOM expert, is this stuff in there?
    -- FK constraints back to Part table and bvId, below shows one of them
    CONSTRAINT fk_det_bomversion FOREIGN KEY (bvId) REFERENCES bomVersion(id)
);

最大的挑战之一是如何在零件描述发生变化时捕获它们所做的更改。因此,在最顶部的 link 中,如果 Case SX1040 的描述从轻松访问更改为轻松访问/通风良好。

因此,在那种情况下,重新打印 BOM(本应由 ISO 标准确定)将发生变化。这是不好的。因此,您需要对文本行的更改进行审计、历史记录,并保存这些 ID(例如部件号)。所以要明确一点,虽然你可以有一个 Parts table,也可以有一个 PartsHistory table(并且来自后者的 id 在 bom 中)。

像上面的模式一样,价格和数量等数字很适合保存。就是文字历史的改动有问题,需要按照上段的方法解决。


注意,我曾经写过一个系统,在更改文本列的情况下,我们会将所有修订都保存在同一个 table 中并且只有 1 行(例如,对于那部分)对于任何给定项目,标记为 active='Y'。这样就不需要连接其他历史 table。无论哪种方式,您都可以灵活地从 GUI 到 select 您想要的版本。请记住,从审计的角度来看,您需要在这些 table 中有一个 updateBy (personId) 和一个 updatedDt。

编辑

你的问题刚刚改变了。查看 table bomVersion

中的新专栏