我和Postgres有一对多的关系。主键实体LUT依赖于其子实体。我正在寻找一种将外键实体中的更改级联到主实体并更新其LUT的方法。
由于可能会有很多变化,所以采用某种去抖动的解决方案会更好。
示例结构:主要实体表:
建筑物
id | 地址 | 名称更新日期 | |
---|---|---|---|
1 | xxxxx | aaa | 2022-08-26 09:23:57.768+00 |
2 | qqq | bbb2022-08-27 10:20:57.768+00 | |
3 | wwwwwww | ccc2022-08-27 09:20:57.768+00 | [/tr>
您基本上有两个选项:
-
在构建和开发触发器时保留
updated_at
列,以便在building
和floor
表之间同步update_at
列。这是您当前拥有的流程
优点:Updated_at
列可通过简单的直接查询轻松访问建筑
缺点:需要额外的代码,可能相当复杂,才能从地板表中选择正确的updated_at
。考虑一下,初始楼层入口包含错误的building_id。更正触发器时需要执行什么操作。从地板上删除怎么样;是否包含当前建筑updated_at
。 -
不要将
updated_at
列实际存储在建筑表上。相反,创建一个从floors
表派生最新updated_at
列的视图
优点:DML操作不需要进一步的操作(代码(。buildings
的Updated_at
列始终显示最新楼层更新值(如果有(
缺点:不能直接针对building
发布DML,因为它是一个视图(保持相同的名称(,因为基础表有不同的名称。这将需要触发器来更新实际的表,或者每个开发人员都了解底层表。
IMHO选项2是迄今为止最好的。它遵循的基本关系模型规定,不存储可派生的。它没有问题吗?显然不是,您可能想要构建instead of
触发器。可能还有其他人。请参阅此处包含每个选项的简短示例。
确保您的外键关系指定了ON UPDATE CASCADE,并且外键将自动更新以匹配主键。