SQL复合属性和冗余

SQL复合属性和冗余,sql,postgresql,Sql,Postgresql,前提:我不熟悉SQL和数据库 我不明白的是:如果构建复合属性的所有组件都存储在数据库中的其他属性中,那么复合属性是否被认为是冗余的?如果是,即使这意味着在数据库中添加一些冗余,我仍然可以使用它们来避免昂贵的查询吗 举个例子:想象一个在线商店,在那里用户可以买卖物品。各表如下: 用户(唯一id、姓名、货币等) 交易(卖方id、买方id、项目id等) 项目(唯一标识、价格等) 现在,为了找到一个用户的利润,我将用户出售的所有商品的价格相加,并从中删除用户购买的所有产品的价格。 在伪代码中: 利润

前提:我不熟悉SQL和数据库

我不明白的是:如果构建复合属性的所有组件都存储在数据库中的其他属性中,那么复合属性是否被认为是冗余的?如果是,即使这意味着在数据库中添加一些冗余,我仍然可以使用它们来避免昂贵的查询吗

举个例子:想象一个在线商店,在那里用户可以买卖物品。各表如下:

  • 用户(唯一id、姓名、货币等)
  • 交易(卖方id、买方id、项目id等)
  • 项目(唯一标识、价格等)
现在,为了找到一个用户的利润,我将用户出售的所有商品的价格相加,并从中删除用户购买的所有产品的价格。 在伪代码中:

利润=总额(销售)-总额(采购)

我看到这个查询的问题是,随着用户进行的事务数量的增加,查询速度会变慢


为了加快速度,我只需在
用户
表中添加一个属性
利润
,该属性在用户每次进行交易时都会更新。它将比一直对所有事务进行求和和和减法更快,但它似乎在数据库中引入了一些冗余,因为
利润
是一个复合值。我需要麻烦吗?

一切都取决于你需要什么。以及你愿意做出的妥协。你总是可以尝试这两种解决方案,看看是否有任何改进

  • 您的原始查询在db中是标准的,我们称之为规范化数据库。在相关字段上添加索引会有很大帮助,并将解决所有性能问题
  • 利润
    是我们所说的计算字段

    • 优点:将速度
      选择
      语句
    • 缺点:需要更多的存储空间(在这种情况下是最小的),会减慢插入/更新速度
对于您的情况,第一个解决方案是确定的,db被构建来处理具有数百万行的配置的表,没有问题

但例如在这种情况下,
distance
需要
sin
cos
radians

( 3959 * acos(cos(radians(' . $location_lat . '))' .
                '* cos( radians( s.latitude ) )' .
                '* cos( radians( s.longitude )' .
                '- radians(' . $location_lng . ') )' .
                '+ sin( radians(' . $location_lat . ') )' .
                '* sin( radians( s.latitude ) ) ) ) as distance'

如果只计算一次
距离
,您将在
选择
中获得重大性能改进,因为这些函数非常慢。

您使用的是哪种dbms?(其中一些有“计算”栏。)在发布答案之前,请您澄清一下。您是否抱怨性能(那么我建议您使用索引)或非规范化(添加额外列)?@jarlh我正在使用PostgreSQL@Dewfy我试图理解,如果我在同一数据库的另一个表中拥有获得函数结果所需的所有数据,那么将函数结果存储在列中是否被视为冗余。