我有三个表,它们的相关列是:
tPerson
-> PersonID
tPersonStatusHistory
-> PersonStatusHistoryID
-> PersonID
-> StatusID
-> PersonStatusDate
Status
-> StatusID
我想存储一个人曾经拥有的所有状态的完整历史记录。但我也希望轻松访问当前状态。
查询以获取当前状态:
SELECT TOP 1 StatusID FROM tPersonStatusHistory
WHERE PersonID = ? ORDER BY PersonStatusDate DESC
我想要的是一个查询,它将获取我的个人记录列表,他们最近的 StatusID 作为查询中的一列。
我们尝试了以下方法:
- 将上述查询作为子查询包含在 select 中。
- 将 CurrentPersonStatusHistoryID 列添加到 tPerson 表并使用调用用户定义函数的计算列对其进行维护。
- 使用 tPersonStatusHistory 表上的触发器维护 CurrentPersonStatusHistoryID 列。
拉取 Person 记录的查询使用率很高,所以我不想每次都查找 History 表。触发方法最接近我想要的,因为数据保存在 Person 表中,并且仅在进行更新时才更改(相比之下,这并不经常发生)。
我发现触发器难以维护,我宁愿远离它们。我还发现,在执行插入选择或涉及多条记录的更新查询时,触发器仅在第一条记录上调用,而不在其他记录上调用。
我真正想要的是在 CurrentPersonStatusHistoryID 的列定义中添加一些逻辑,按下 Save 并让它在幕后保持和更新,而无需我的干预。
鉴于多对多关系很常见,我想知道是否有其他人遇到过类似的情况,并对实现这一点的最高性能、最好是最少麻烦的方式有所了解。