2012-10-14 59 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服務來輪詢這個觸發器。

然後我會執行你需要的服務中的任何數據庫命令來移動數據,運行你的算法等;注意錯誤處理和日誌記錄(服務沒有用戶界面,所以你必須寫錯誤到系統日誌並確保有人關注)。考慮將數據庫代碼包裝在存儲過程中 - 這使得從服務中調用它們更容易。

聽起來這是一個相當複雜的應用程序;注意代碼質量,考慮單元測試(儘管單元測試數據庫代碼很困難)。購買史蒂夫麥康奈爾的「代碼完整」,如果你不是專業的編碼人員,請閱讀本書封面。