【发布时间】:2021-07-13 21:37:48
【问题描述】:
我对 SQL 数据库世界很陌生。我有一个要求,我必须将对该表行所做的每个更改(即更新、删除)存储为版本。我可以获取最新版本(即带有isLatest、isDeleted 标志的最新更改。现在,我需要加入至少 3 个表(如果它很吓人,它可能会超时增加到 20 个表)。所以应该将加入应用于最新的文档,即isLatest=true,它没有被删除,即isDeleted=false。有没有办法在查询结束时使用通用sql,因为所有表都有isLatest和IsDeleted行。
这是我的表格结构和预期输出。
用户表:
| id | name | version | isLatest | isDeleted |
| 1 | John | 0 | false | false |
| 1 | john | 1 | false | false |
| 1 | Johnny | 2 | true | false |
| 2 | Sarah | 2 | true | false |
| 2 | sarah | 1 | false | false |
| 2 | Sarah | 0 | false | false |
| 3 | Jane | 1 | true | true |
| 3 | Jane | 0 | false | true |
就业表:
| user_id | employment_id | type | isLatest | isDeleted | |
| 1 | emp1 | Intern | false | false | |
| 1 | emp1 | Part Time | false | false | |
| 1 | emp1 | Full Time | true | false | |
| 2 | emp2 | Full Time | false | false | |
| 2 | emp2 | Part Time | true | false | |
| 3 | emp3 | Part Time | true | true | |
预期输出:
| user_id | name | employment_id | type | isLatest | isDeleted |
| 1 | Johnny| emp1 | Full Time | true | false |
| 2 | Sarah | emp2 | Part Time | true | false |
我想使用的查询:
select employment.user_id, user.id, employment.employment_id,
employment.type, user.isLatest, user.isDeleted
from employment
inner join user ON user.id = employment.user_id
where isLatest = true and isDeleted = false
【问题讨论】:
-
与您的问题无关,而只是一般性的 FYI - 这种方法存在一些问题(假设您没有遗漏任何信息)。一 - 它不遵循 3NF(已删除和最新版本是 id 唯一的数据),二 - 没有主键 - 您可以从 (user_id, version) 派生主键,但这可能会更令人头疼。三 - 无论您采用哪种方法,请确保您的索引与您的查询一致,否则忘记 20 个表,3 会让人头疼:)
-
是的。我使用 id 和 version 作为复合主键
标签: javascript mysql sql node.js