【发布时间】:2018-08-17 12:12:54
【问题描述】:
我有一个产品表,其中包含主键 @productid (bigint)、产品编号 (int) 和版本 (int)
任何时候有人只更改产品记录,我计划在数据库中插入一个具有相同产品号和版本号 + 1 的新行。这将为我提供我需要的历史跟踪记录,因为我可以看到版本随时间的变化。
/* Selecting the current version is simple */
Select top 1 *
from products
where productnumber = @productnumber
order by version desc
但是,我的问题在于外键一对多或多对多关系表。此表指向许多其他也需要跟踪的(即带有日期范围的产品定价、产品类别等)。
/* Product categories, pricing */
/* Should I use @productnumber here? How do I track changes to these records? */
select name
from productcategories
where productid = @productid
select price
from productpricing
where productid = @productid and
StartDate > @StartDate and
EndDate <@Enddate
所以现在任何时候有版本更改,我都计划重新插入新的类别和定价记录以及生成的新主键产品 ID。这将导致大量重复,特别是如果这些记录未作任何更改。
此外,问题也随之而来 - 如果某个类别被删除但产品记录没有更改,会发生什么情况?我想看看是谁删除了这个类别。本质上,需要对每张表进行全面审计。
我见过一些不同的例子,但它们中的大多数似乎只处理一个表中的记录,而不是一对多或多对多关系的一部分的记录。我希望这可以在不需要额外表格的情况下完成。
有没有更好的方法或做法?这会是一场性能噩梦吗?
【问题讨论】:
标签: sql sql-server database database-design sql-server-2017-express