2014-01-31 15 views
0

假設我有我的數據庫中下表(我可以隨意重新設計,如果我願意的話):設計一個WebService API數據庫模式

  • 用戶:關於每個系統的用戶信息用戶有一套 授權。
  • 授權:有關每個授權意味着什麼的信息。每個 授權與它適用的許多主機相關聯。
  • 主機:有關應用程序所涉及主機的信息。每個主機都有一個 的位置。
  • 區域:將位置組合在一起。
  • 位置:組主機在一起。

我想一個WebService接口設計,這個數據庫模式,使此WebService 客戶將能夠提出這樣的問題:

  • 什麼是該系統的用戶?
  • 什麼授權擁有用戶X?
  • 主機Y在什麼位置?
  • 位置Z的主人是什麼? - 。 .... 等等。

該接口的功能/方法應該是什麼?

  • 一種流行的解決方案是:
    • 的getUser(ID)/ getusers()獲得用戶,授權每個用戶擁有的ID列表 一起。
    • getauth(id)/ getauths()獲取所有授權以及它們適用的主機的ID列表 。
    • gethost(id)/ gethosts()獲取所有主機。以及每個主機的位置的 的ID。 .....

有了這個方案,得到一個主機裝置的位置做兩次調用 的API:

h = gethost(id), 
    loc_id = h.location_id; 
    location = getlocation(loc_id); 

我不喜歡這種方法是它強制 api的客戶端在獲取他想要的信息之前,通過對象的層次結構對API跟蹤進行大量(異步)調用。

在您的經驗是這是做到這一點的最佳方式?

PS。如果您的解決方案涉及到更改架構,我也非常喜歡。

編輯:換句話說,我想是很好的中間地帶

解決方案1之間
  • :Web服務只有一個方法:查詢(字符串),它接受像SQL的數據庫查詢語言查詢。解決方案2:對於用戶可能想要的每個可能的查詢,Web服務都有一個方法:getUserWithAuthorization(user_id)getUser(user_id)getLocationOfHost(host_id)getAreasWithLocations()等等#interfacebloatinghell。

+0

如果你顯示錶的關係,通過圖表或SQL定義中的問題會更加清晰。 –

回答

0

首先,刪除所有動詞(getResourceX)。

通常情況下,您可以通過客戶端可以進行單個調用並獲取所有信息的方式來設計API,但也可以在更細粒度的級別上獲取數據。

如果我認爲正確的數據集,以從最大到最小的子集是這樣的: 領域 - >位置 - >主機 - >授權 - >用戶

因此,這可能是你的資源URI

1 get調用

api/areas 

將返回所有領域以及它們的所有位置,併爲每個位置的主機等

如果您想了解某一特定領域的信息,你可以做1呼叫

/api/areas/{id}