Database “Active”变量,以指示哪些记录是有效的和无效的。@Jeach:那么,您是否将所有非检索DML操作插入到审核表中?如果是这样,那么您只需查看审核表即可获得历史记录,而查看非审核表即可获得当前版本(但这是一种优化,因为当前版本的信息也在审核表中)。单个记

Database “Active”变量,以指示哪些记录是有效的和无效的。@Jeach:那么,您是否将所有非检索DML操作插入到审核表中?如果是这样,那么您只需查看审核表即可获得历史记录,而查看非审核表即可获得当前版本(但这是一种优化,因为当前版本的信息也在审核表中)。单个记,database,database-design,versioning,Database,Database Design,Versioning,“Active”变量,以指示哪些记录是有效的和无效的。@Jeach:那么,您是否将所有非检索DML操作插入到审核表中?如果是这样,那么您只需查看审核表即可获得历史记录,而查看非审核表即可获得当前版本(但这是一种优化,因为当前版本的信息也在审核表中)。单个记录中的开始时间和结束时间的优点是,您可以在不查看任何其他记录的情况下说出该记录的有效性范围。一旦删除这两条记录中的一条,就必须查看上一条或下一条记录以查找数据,相信我,这会使SQL变得更加困难。(一开始并不容易;你不需要再难了。)我知道这个线程


“Active”变量,以指示哪些记录是有效的和无效的。@Jeach:那么,您是否将所有非检索DML操作插入到审核表中?如果是这样,那么您只需查看审核表即可获得历史记录,而查看非审核表即可获得当前版本(但这是一种优化,因为当前版本的信息也在审核表中)。单个记录中的开始时间和结束时间的优点是,您可以在不查看任何其他记录的情况下说出该记录的有效性范围。一旦删除这两条记录中的一条,就必须查看上一条或下一条记录以查找数据,相信我,这会使SQL变得更加困难。(一开始并不容易;你不需要再难了。)我知道这个线程已经有好几年了,但是你能告诉我们你最终实现了什么解决方案吗?
Person
------------------------------------------------
ID                UINT NOT NULL,
NameID            UINT NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL

PersonAudit
------------------------------------------------
ID                UINT NOT NULL,
NameID            UINT NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL,
UserID            UINT NOT NULL,         -- Who
PersonID          UINT NOT NULL,         -- What
AffectedOn        DATE NOT NULL,         -- When
Comment           VARCHAR(500) NOT NULL  -- Why

Name
------------------------------------------------
ID                UINT NOT NULL,
FirstName         VARCHAR(200) NOT NULL,
LastName          VARCHAR(200) NOT NULL,
NickName          VARCHAR(200) NOT NULL

NameAudit
------------------------------------------------
ID                UINT NOT NULL,
FirstName         VARCHAR(200) NOT NULL,
LastName          VARCHAR(200) NOT NULL,
NickName          VARCHAR(200) NOT NULL,
UserID            UINT NOT NULL,         -- Who
NameID            UINT NOT NULL,         -- What
AffectedOn        DATE NOT NULL,         -- When
Comment           VARCHAR(500) NOT NULL  -- Why
ID            :  89213483
First Name    :  Firsty
Last Name     :  Lasty
Nick Name     :  Nicky
Date of Birth :  January 20th, 2005
Email Address :  my.email@host.com
`Change` 1 2 3 4 5 6 `NameAudit` 1 - created as John Smith 5 - changed to James Smith `PersonAudit` 1 - created as born on `01.01.1980` in `Seattle, WA` 2 - changed DOB to '01.01.1980` 3 - changed DOB to '02.01.1980` 4 - changed DOB to '02.01.1980` 6 - changes POB to `Washington, DC`
SELECT  c.id,
        (
        SELECT   MAX(id)
        FROM     NameAudit na
        WHER     na.id <= c.id
        ) as nameVersion,
        (
        SELECT   MAX(id)
        FROM     PersonAudit pa
        WHER     pa.id <= c.id
        ) as personVersion,
        na.*,
        pa.*
FROM    change c
JOIN    NameAudit na
ON      na.id = nameVersion
JOIN    PersonAudit pa
ON      pa.id = nameVersion
WHERE   change_id BETWEEN 1 AND 6
Start time        -- When this set of values became valid
End time          -- When this set of values became invalid
PersonID          -- Person.ID (or PersonAudit.ID) for Person data
NameID            -- Name.ID (or NameAudit.ID) for Name data
DOB               -- Date of Birth recorded while data was valid
Email             -- Email address recorded while data was valid
FirstName         -- FirstName recorded while data was valid
LastName          -- LastName recorded while data was valid
NickName          -- NickName recorded while data was valid