建模对SQL中关系的更改

时间:2017-05-10 21:02:54

标签: sql

我在SQL中有一对多的关系。这很简单:

CREATE TABLE relation (oneId INTEGER, manyId INTEGER);

这种关系可以随时改变。但是,我需要单独存储这些更改 - 我需要知道更改了什么,并且可能会将它们回滚。

我对如何在SQL中干净地建模这一点感到茫然。到目前为止,我提出的最好的是:

CREATE TABLE changes (oneId INTEGER, oldManyId INTEGER, newManyId INTEGER);
CREATE VIEW fused (oneId, manyId) AS [...complex SQL here...]

所以:更改写入changes;我们指出任何特定关系(oneId, oldManyId)已被(oneId, newManyId)取代,我们将manyId设置为NULL以表示我们正在删除条目;然后我们使用一个视图将两个表融合在一起,以提供世界状态的统一视图。

但融合的观点非常难。据我所知,我需要在两个表上进行连接,然后按行计算以确定manyId的值应该是什么。我关心表现;我需要快速查找与每个many关联的所有one。我最终得到了:

SELECT relation.oneId, COALESCE(changes.newManyId, relation.manyId)
FROM relation LEFT JOIN changes
ON relation.oneId = changes.oneId
  AND relation.manyId IN (changes.oldManyId, changes.newManyId)
  AND changes.newManyId IS NOT NULL -- eliminate removed tuples
UNION ALL
SELECT oneId, newManyId FROM changes WHERE oldManyId IS NULL -- include added tuples

这个查询吓到我了。有更好的方法吗?

0 个答案:

没有答案