Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在数据库实体中的属性之间创建依赖关系?_Sql_Database_Postgresql - Fatal编程技术网

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

Sql 如何在数据库实体中的属性之间创建依赖关系?,sql,database,postgresql,Sql,Database,Postgresql,我的数据库中有一个具有以下属性的矩形实体: CREATE TABLE Rectangle ( Id INTEGER PRIMARY KEY NOT NULL, SideA INTEGER NOT NULL, SideB INTEGER NOT NULL, Area INTEGER ); 在我插入数据的那一刻,无法指定区域。每当我在Java应用程序中按下“更新区域”按钮时,Area值就会更新 现在,如果在使用应用程序

我的数据库中有一个具有以下属性的
矩形
实体:

CREATE TABLE Rectangle (
  Id           INTEGER PRIMARY KEY NOT NULL,
  SideA        INTEGER NOT NULL,
  SideB        INTEGER NOT NULL,
  Area         INTEGER
);
在我插入数据的那一刻,无法指定
区域
。每当我在Java应用程序中按下“更新区域”按钮时,
Area
值就会更新

现在,如果在使用应用程序时编辑了
SideA
,我希望同时编辑
Area
。如何使实体的属性独立于其他属性,并实时更新?在Java级别不使用模式观察器,但在postgres/SQL中使用特定关键字,这是可能的吗

编辑:我注意到大多数答案都在问我同样的问题,我将添加这个小注释


我管理的真正的数据库实际上需要使用
galaxy
表和其他相关表中的一些参数来计算星系的质量。它需要存储数千个星系的质量,应用程序将以100个为一组显示它们。由于显示质量列表是一项频繁的操作,而更新其中一个值的操作很少发生,因此我决定计算所有值一次,并将其存储在数据库中我知道这是一个冗余信息,但在这种情况下,我认为这是值得的。

因为面积等于SideA*SideB,所以您可以通过这样做将冗余信息存储在数据库中(我不知道是否可能)

要解决您的问题并不存储这些冗余数据,您可以在查询数据库时执行以下操作:

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

大多数数据库引擎支持“触发器”的概念。你给你的问题贴上了标签——这个平台的文档

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


最后-你确定你需要预先计算这个吗?今天的数据库速度非常快,例如,您可以创建一个包含实时计算的视图。

谢谢您的回答,但我简化了实际问题:)实际“面积”值的计算稍微复杂一些,由于数据库中有数千个条目,我宁愿存储它们,而不是每次需要时都计算它们!而且,
SideA
几乎不会更改,但我希望始终有一个一致的数据库。@Robb1:你认为为什么需要存储它?你到底是如何计算面积的,让你觉得这太“复杂”了,不能“在飞行中”完成?可能是重复的