大家好日子,
我有一些问题,关于如何计算存储在数据库中的数据。就像,我有一张桌子:
| 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查询。也许有一种更简单的方法可以做到这一点?感谢您抽空帮助我。
答案 0 :(得分:0)
方法很少:
如果您的数据库负载较低(每分钟查询很少,每次获取几千行),那么请先使用aproach。 如果在飞行中计算表现不佳(数百万条记录,每秒x次提取......)尝试第二或第三种方法。 如果你的数据库支持计算和持久字段,比如MSSQL Server,那么第三个就可以。
修改强>
通常,正如其他人所说,您将在查询中执行计算。也就是说,只要您的项目足够简单。
首先,当您存储所有项目及其价格的表格受到来自多个客户端的插入/更新/删除攻击时,您不希望阻止或被其他客户端阻止。你必须明白,例如表X更新可能会阻止您从表X中选择,直到它完成(查找页面/行锁定)。这意味着您将 love 并行非规范化结构(包含产品的表格及其计算的东西)。这是例如报告发挥作用。
其次,当计算足够简单(a * b)并且在不那么多的记录上完成时,那就没关系。当你有... 10M记录,你必须将每一行与其他几行相关联,并对某些组进行一些聚合,计算/持久字段有可能节省您的时间 - 使用此方法可以使结果快速增加10-100倍。
答案 1 :(得分: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
答案 2 :(得分:0)
拥有10000条记录,使用临时表不是一个好主意。
你最好还有另一张名为ProductsPriceHistory的表,你可以在其中进行peridodically计算和存储,比方说,月度报告。
通过这种方式,您的报告会更快,并且您无需在每次获取报告时进行计算。
请注意,如果您的日期间隔是固定的,我的意思是,每月,每季度,每年等,这种方法都可以。 如果您的日期间隔是动态的,例如。从2011年10月20日到2011年10月25日,从2011年5月20日到2011年8月13日等,这种方法不起作用。
另一种方法是在ASP.Net上进行计算。
答案 3 :(得分:0)
即使有10000条记录,最好的办法是动态计算这样的东西。这就是结构化数据库的目的。
例如:
SELECT [quantity of items] * [item price] AS [full price]
, [MyTable].*
FROM [MyTable]
更复杂的计算涉及到3个或更多表和数千个记录的JOIN可能会使自己存储值。
答案 4 :(得分:0)
您应该在申请中分开关注点:
E.g。如果您使用Linq-2-sql进行数据检索,则可以非常简单地将fullprice添加到您的实体中。实体框架也是如此。此外,如果需要,您已经可以在SQL select中计算p * q。只有当性能真的成为问题时,您才可以开始考虑临时表,具有聚簇索引的视图等。