2010-08-26 58 views
0

在我的情況下,單獨的系統是一個網絡服務(但它可能是任何事情)。 我的問題是,當涉及到數據時,如果與一個單獨的系統(如Web服務)集成,最佳做法是什麼?通過網絡服務集成兩個系統的最佳實踐

示例:Web服務提供產品列表。產品使用類別進行分組。您可以將所有產品放入子類別中。您可以通過其id(整數)或其名稱(唯一值)來獲取特定產品。

在我的應用程序:

我展示類別和產品列表 - 並且用戶可以選擇該產品,並指定訂單數量。

  1. 我應該存儲類別的名稱還是存儲類別的ID?

  2. 我應該存儲產品的名稱還是產品的ID?

  3. 我應該如何命名在存儲從Web服務 數據數據庫中的字段(類別編號或WsCategoryId:所以按照慣例人知道價值是從哪裏來的?)

任何其他最佳做法?

任何其他參考?

回答

2

從你的問題我的理解是Web服務的接口看起來是這樣的:

/product/ 
/product/{ProductId} 
/product/{ProductName} 
/product/category/{CategoryId} 

既然你是問,如果你要存儲CategoryName,我認爲它是獨一無二的(同ProductName)。
我還假設Web服務處理產品或類別被透明地重命名的情況(即通過提供重定向或任何其他方式來允許您檢測並相應地處理它)。如果沒有,請不要考慮將名稱存儲爲產品或類別的參考 - 始終使用ID。

我會給你的問題#1和#2提供同樣的答案。即使ProductNameCategoryName的唯一性在技術上允許您將它們作爲產品和類別的唯一標識符存儲在您的應用程序中,但我會選擇存儲其ID。主要決定點將是您的存儲介質。由於您使用的是數據庫,並且Web服務允許您通過唯一的數字ID訪問對象,因此應該使用數據庫規範化規則 - 因此,您應該使用商店ID

但是,上面假設您使用的是關係數據庫 - 如果您使用的是NoSQL數據庫,我認爲存儲名稱而不是ID將是一個可行的選項(至少據我可以告訴我的目前對NoSQL解決方案的理解,不幸的是我還沒有任何實際的經驗)。

關於問題#3 - 我要堅持,你已經在你的數據庫中使用的命名約定。在這裏有很多不同的命名錶和列的約定,所以我真的懷疑是否有任何關於如何命名引用Web服務對象的列的標準化約定。我會根據您的現有命名約定以及列的用途明確將其命名爲正在使用該系統的所有人。請注意,如果您將來有可能使用其他Web服務,則應考慮將該服務的名稱保留在列名中,而不是使用通用ws前綴 - 例如, AmazonProductIdAmazonCategoryId

我會嘗試從我的經驗,指出了幾個項目,但我不會其標記爲的最佳實踐 - 只是主題思考的問題。

根據我的經驗,我發現以與數據庫中的數據相同的方式處理來自Web服務的數據是有用的 - 至少從應用程序的角度來看,您的存儲層將從應用程序邏輯中抽象出來。我的意思是,無論您的存儲介質是數據庫還是Web服務,您都應該考慮並準備類似的方案。 與數據庫相同,Web服務可能會停止運行,兩者都可能有其數據或完整性損壞,兩者都需要您清理或以其他方式處理輸入數據。

數據應該是高的名單上的項目的緩存 - 除了明顯的性能的原因,它可以讓你處理Web服務(停運一個擴展由您緩存的數據限制)。
一個例子就是您的應用程序在應用程序中顯示最常購買產品的列表產品。如果您的應用程序僅存儲產品ID,則必須對Web服務執行一個或多個請求以檢索需要在列表中顯示的所有產品的名稱。如果您在本地或在您的數據庫中緩存產品名稱,您將獲得更好的性能,節省您的資源,並且在Web服務停機的情況下您還將擁有故障安全方案。

參照完整性是使用Web服務時需要考慮的另一個重要方面。由於Web服務與數據庫完全分離,因此您無法像創建數據庫解決方案那樣創建外鍵。這意味着Web服務中的數據更改(即產品更新或刪除)可能會破壞數據庫中數據的完整性。

關於引用,這些主要取決於您即將使用的Web服務類型(您未指定要使用的服務)。如果服務基於REST原則,我可以推薦Restful Web Services by Leonard Richardson and Sam Ruby。儘管它並不專注於應用程序/服務集成,但它是對REST的一個很好的介紹。