2012-10-14 54 views
3

我一直在寻找一些建议,关于如何处理我正在进行的项目,但无济于事。我在第四次完善我正在研究的“应用程序”时,前两次是在Excel中,第三次在Access中,现在在Visual Studio中。该领域是制造业。将项目开发推向新水平

基本思想是我从一个海量的Sybase服务器上读取只读数据,过滤它并在Access中每天创建更小的表(使用删除和附加查询),然后做一堆东西。更具体地说,我使用一系列查询来合并多个表中的数据或以特定方式组合数据(聚合函数),然后将这些数据放入一个表中(这样我就可以使用DAO.recordset对数据进行排序和操作,并运行多个自定义算法)。然后在整个数据库中重复该过程多次,直到创建一组相关的表。

很多时候我会在一个值为1.1的查询中创建一个字段,这样当我将它附加到表中时,我可以将信息存储在字段中。因此,随着过程的继续,表格的字段数量会发生变化。

整个应用程序由4个“后端”数据库组成,这些数据库通过共享驱动器与各种输出(前端访问应用程序或Excel)链接在一起。

所以我的问题是,这有多少数据驱动的应用程序解决问题本质上工作?每个后端数据库每天更新一次新数据,每次更新大约需要10秒(3个)和2分钟(1个)。

项目目标。我想很快转移到SQL Server。前端将是一个Web应用程序(我知道基本的Web开发和管理的灵活性),Visual Studio将C#/ .NET的IDE。

这些算法应该在“数据库内部”运行,还是在每个服务器请求上使用一系列C#函数。我知道你不应该将数据存储在数据库中,除非它是一个实际的数据点,并且在Access中,我有许多列仅包含vba中算法的计算。

事实是,我已经看到多个专业的Access应用程序,并且从来没有见过一个具有复杂性或甚至接近我的(无论好坏)的应用程序。但我知道一些专业软件应用程序比我的好1000倍。

请所以请请给我一些建议。我完全依靠自己,需要一些关于如何以正确的方式来处理这个项目的指导。

+0

第一步设计数据库。阅读一些教程,然后看看http://www.databaseanswers.org/data_models/ –

+0

我将它存储在Access中的主要原因是,例如,我将一个数据表从200万行减少到15,000行。 Access在15,000行表中运行算法已经够难了,如果我没有削减表,它可能只会崩溃。另外,我只对我的工厂而不是每个工厂都感兴趣。至少对于这个版本......你确实帮我弄清楚了我正在做的主要奇怪事情 - 使用访问数据库作为数据操作/算法/统计工具而不是数据存储工具。 – user1745022

回答

1

如果您打算使用sql server或任何其他完整的客户端服务器数据库管理系统(DBMS),技巧(通常)是在服务器上尽可能多地执行操作。

取决于您如何编写代码。一般而言,桌面的优化与服务器的优化相反。

例如,如果您是查找客户设施。

在桌面上,你会得到整个表格,然后利用定位说按名称查找记录,后/邮政编码等。由于有效您的应用程序服务器和客户端。

在设置的客户端服务器中,您将客户名称等传递给数据库管理系统,并让它找到匹配的客户并仅将其传回。

因此,在你的情况忘记了Web应用程序位,你必须看看你的应用程序做什么,并说我可以写在SQL中。

所以

如果你有

// get orders 
foreach(Order order in clientOrders) 
{ 
    if (Order.Discount > 0) 
    { 
     Order.Value = Order.ItemCount * Order.ItemPrice * Order.Discount; 
    } 
} 
// save orders 

你会替换成一个查询,确实

Update Orders Set Value = ItemCount * ItemPrice * Discount 
Where ClientID = @ClientID and Discount > 0 

让服务器做的工作在服务器上,而不是推和拉的大量的数据进出应用程序。

如果我是你,虽然我会做sql server部分,或者我会做web服务器部分,而不是两个同时。在客户端服务器方面有很多重叠。任何一方都不能排除另一方,但很多时候你都可以用不同的方式解决同样的问题。

+0

类似于Select * From Table Order By SomeColumn Desc Limit 1将按照该顺序为您提供最后一行。这不是排序无关紧要,这是你不应该假设它... –

1

随着更多细节的出现,您的应用程序看起来会涉及到将15K行存储在您的Access数据库文件中,以便稍后可以对这些数据执行计算。

但是,目前尚不清楚为什么您觉得这些数据必须存储在Access中才能执行计算。

理想情况下,我们将创建一个查询来要求服务器执行这些计算。如果您的服务器的功能无法实现这一功能,或者计算量过大以至于无法接受服务器上的处理负载,则您仍不需要将所有原始数据下载至Access,以便将其用于您的计算。相反,您可以打开由服务器上的查询填充的记录集,通过记录集行进行计算并将结果存储在Access表中(通过第二个记录集)。

Public Sub next_level_outline() 
    Dim db As DAO.Database 
    Dim rsLocal As DAO.Recordset 
    Dim rsServer As DAO.Recordset 
    Dim varLastValue As Variant 

    Set db = CurrentDb 
    Set rsLocal = db.OpenRecordset("AccessTable", dbOpenTable, dbAppendOnly) 
    Set rsServer = db.OpenRecordset("ServerQuery", dbOpenSnapshot) 
    Do While Not rsServer.EOF 
     rsLocal.AddNew 
     rsLocal!computed_field = YourAlgorithm(varLastValue) 
     rsLocal.Update 
     varLastValue = rsServer!indicator_field.value 
     rsServer.MoveNext 
    Loop 
    rsLocal.Close 
    Set rsLocal = Nothing 
    rsServer.Close 
    Set rsServer = Nothing 
    Set db = Nothing 
End Sub 

这只是一个粗略的提纲。很大程度上取决于YourAlgorithm()的性质。从评论中,我收集它与前一行有关...所以我包括varLastValue作为占位符。

您的方法的一部分是过滤200万源行到适用于您所选工厂的15K行。这样做与WHERE子句中ServerQuery

WHERE factory_id = 'foo' 

如果该行的排序是YourAlgorithm()重要的,包括在ServerQueryORDER BY条款。

此建议的驱动程序是为了避免在Access中冗余存储数据。而且,如果你不能完全消除冗余,至少要限制它的范围。

然后,您可能会发现可以将Access存储整合到单个数据库文件而不是四个。单个数据库文件可以简化您的应用程序的其他方面,并应提供改进的性能。

我认为你应该确定你已经彻底解决了这个问题,然后再进入下一个应用程序发展阶段。我不相信ASP.Net会让这个挑战变得更容易。

+0

你的问题似乎是一个移动的目标。我建议VBA程序,因为我猜它可能大致类似于你已经在你的算法在Access中。如果您将在SQL Server中执行此操作,则可能会有更好的方法。也许你可以在一个新问题中提出这个问题。 – HansUp

1

您描述的应用程序似乎是“ETL”的示例 - 提取,转换,加载。

这是我作为一名专业程序员所从事的第一批项目之一 - 它明显不平凡。有很多工具可以用来帮助完成这个过程(包括来自微软的一个工具),但是他们的目标主要是填充数据仓库 - 目前还不清楚你正在构建什么,所以这可能不是非常有用。不过,请阅读维基百科文章,也许看看一些ETL工具来获得一些想法。

如果你走自己的路,我会建议编写一个windows服务来自动运行你的ETL过程。我假设你在某种触发器上运行导入 - 每晚每小时,当制造系统向你发送消息或任何消息时;编写你的Windows服务来轮询这个触发器。

然后我会执行你需要的服务中的任何数据库命令来移动数据,运行你的算法等;注意错误处理和日志记录(服务没有用户界面,所以你必须写错误到系统日志并确保有人关注)。考虑将数据库代码包装在存储过程中 - 这使得从服务中调用它们更容易。

听起来这是一个相当复杂的应用程序;注意代码质量,考虑单元测试(尽管单元测试数据库代码很困难)。购买史蒂夫麦康奈尔的“代码完整”,如果你不是专业的编码人员,请阅读本书封面。