我的数据库中有一个temp[2] = 35
实体,其中包含以下属性:
Rectangle
在我插入数据时,CREATE TABLE Rectangle (
Id INTEGER PRIMARY KEY NOT NULL,
SideA INTEGER NOT NULL,
SideB INTEGER NOT NULL,
Area INTEGER
);
无法指定。每当我按下Java应用程序中的“更新区域”按钮时,Area
值将被更新。
现在,如果在使用应用程序时编辑了Area
,我希望SideA
同时编辑 。如何使实体的属性依赖于他人并实时更新?是否可以在Java级别使用模式观察器但在postgres / SQL中使用特定关键字?
编辑:我注意到大部分答案都在问我同样的问题,我会添加这个小笔记。
我管理的真实数据库实际上需要使用Area
表和其他相关表中的一些参数来计算星系的质量。它需要存储成千上万个星系的数量,应用程序将以100个为一组显示它们。由于显示质量列表是一个经常的行动,而更新其中一个值正在发生很少,我决定一次计算所有值并将它们存储在数据库中。 我知道这是一个多余的信息,但在这种情况下恕我直言是值得的。
答案 0 :(得分:1)
大多数数据库引擎都支持"触发器"的概念。您已将问题标记为Postgres - here's该平台的文档。
请仔细阅读触发器及其风险 - 编写一个能够将数据库性能暂停的触发器非常容易。您现在也在代码中有重复 - 当您在Java应用程序中按下按钮时,需要触发相同的逻辑,当您更新SideA属性时,和。当然,您可以将计算逻辑放入存储过程,并从两个位置调用它。
最后 - 你确定你需要预先计算吗?数据库今天真的很快,你可以创建一个包含实时计算的视图。
答案 1 :(得分:0)
由于Area等于SideA * SideB,你可以通过这样的方式在你的数据库中存储冗余信息(我不知道它是否可能)。
要解决您的问题并且不存储这些冗余数据,您可以在使用以下内容查询数据库时进行计算:
SELECT
SideA,
SideB,
SideA + SideB AS Area
FROM Rectangle