如何在数据库实体中的属性之间创建依赖关系?

时间:2017-08-22 07:31:16

标签: sql database postgresql

我的数据库中有一个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个为一组显示它们。由于显示质量列表是一个经常的行动,而更新其中一个值正在发生很少,我决定一次计算所有值并将它们存储在数据库中。 我知道这是一个多余的信息,但在这种情况下恕我直言是值得的。

2 个答案:

答案 0 :(得分:1)

大多数数据库引擎都支持"触发器"的概念。您已将问题标记为Postgres - here's该平台的文档。

请仔细阅读触发器及其风险 - 编写一个能够将数据库性能暂停的触发器非常容易。您现在也在代码中有重复 - 当您在Java应用程序中按下按钮时,需要触发相同的逻辑,当您更新SideA属性时,。当然,您可以将计算逻辑放入存储过程,并从两个位置调用它。

最后 - 你确定你需要预先计算吗?数据库今天真的很快,你可以创建一个包含实时计算的视图。

答案 1 :(得分:0)

由于Area等于SideA * SideB,你可以通过这样的方式在你的数据库中存储冗余信息(我不知道它是否可能)。

要解决您的问题并且不存储这些冗余数据,您可以在使用以下内容查询数据库时进行计算:

SELECT  
SideA,  
SideB,  
SideA + SideB AS Area
FROM Rectangle