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