0

今天是个好日子,

我有一些问题,关于如何计算存储在数据库中的数据。就像,我有一张桌子:

|   ID    | Item name | quantity of items | item price | date |

例如,我存储了 10000 条记录。

首先我需要做的是从日期间隔中提取项目,所以我不需要整个数据库来进行计算。然后我从该日期间隔获取项目,我必须添加一些表格,例如计算:

full price = quantity of items *  item price

并将它们存储在每个项目的新表中。因此,从日期间隔中挑选的项目的数据库应如下所示:

|   ID    | Item name | quantity of items | item price | date |  full price |

关键是我不知道如何存储我选择的日期间隔的项目。比如,我是否创建了一些临时表,或者什么?这将使用 ASP.NET Web 应用程序,对于数据库中的计算,我想我将使用 SQL 查询。也许有更简单的方法来做到这一点?感谢您抽出时间来帮助我。

4

5 回答 5

0

拥有 10000 条记录,使用临时表不是一个好主意。

您最好有另一个表,称为 ProductsPriceHistory,您可以在其中定期计算和存储(比方说)月度报告。

这样,您的报告会更快,并且您不必每次想要获取报告时都进行计算。

请注意,如果您的日期间隔是固定的,我的意思是每月、每季度、每年等,这种方法是可以的。如果您的日期间隔是动态的,例如。从 2011 年 10 月 20 日到 2011 年 10 月 25 日,从 2011 年 5 月 20 日到 2011 年 8 月 13 日等,这种方法不起作用。

另一种方法是在 ASP.Net 上进行计算。

于 2012-10-26T15:08:56.730 回答
0

即使有 10000 条记录,最好的办法是即时计算类似的内容。这就是结构化数据库的设计目的。

例如:

SELECT [quantity of items] * [item price] AS [full price]
  , [MyTable].*
FROM [MyTable]

涉及 JOIN 到 3 个或更多表和数千条记录的更复杂的计算可能有助于存储值。

于 2012-10-26T15:11:41.770 回答
0

就像其他人所说的那样,您可以即时执行这些查询,而不是存储它们。

但是,要回答您的问题,这样的查询应该可以解决问题。

我没有对此进行测试,因此语法可能会有所偏差,尽管它会让您走上正确的轨道。

最终,您必须使用选择进行插入

insert into itemFullPrice
select id, itemname, itemqty, itemprice, [date], itemqty*itemprice as fullprice from items where [date] between '2012/10/01' AND '2012/11/01'

再一次..如果我的语法有点不对,请不要开枪..今天很忙:D

于 2012-10-26T15:08:12.227 回答
0

有几种方法:

  • 使用 sql 查询即时计算 - 这样不会将任何内容存储到数据库中
  • 使用相同或另一个表进行计算
  • 使用计算字段

如果您的数据库负载较低(每分钟查询很少,每次提取几千行),请使用第一种方法。如果动态计算表现不佳(数百万条记录,每秒获取 x 次......)尝试第二或第三个方法。如果您的数据库支持计算和持久字段,例如 MSSQL Server,第三个就可以了。

编辑:

通常,正如其他人所说,您将在查询中执行计算。也就是说,只要你的项目足够简单。

首先,当您存储所有项目及其价格的表受到来自多个客户端的插入/更新/删除的攻击时,您不想阻止或被其他人阻止。您必须了解,例如表 X 更新可能会阻止您从表 X 中选择,直到它完成(查找页/行锁定)。这意味着你会喜欢并行的非规范化结构(带有产品的表格和计算出来的东西)。这就是例如报告发挥作用的地方。

其次,当计算足够简单(a*b)并且只处理了不多的记录时,就可以了。当您有例如 10M 条记录并且您必须将每一行与其他几行相关联并对某些组进行一些聚合时,计算/持久字段有可能会节省您的时间 - 您可以获得高达 10-100 倍的更快结果使用这种方法。

于 2012-10-26T14:56:06.363 回答
0

您应该在应用程序中分离关注点:

  • 用于演示的 aspx 页面
  • 用于数据持久性的 sql server
  • 某种中间“业务”层用于额外的逻辑,如 fullprice = p * q

例如,如果您使用 Linq-2-sql 进行数据检索,那么将全价添加到您的实体非常简单。实体框架也是如此。此外,如果您愿意,您已经可以在 SQL 选择中进行 p*q 的计算。只有当性能真的成为问题时,您才能开始考虑临时表、具有聚集索引的视图等。

于 2012-10-26T19:53:13.677 回答