2013-07-29 108 views
3

我正在嘗試爲應用程序編寫REST接口。rest:修改與資源關聯的資源的順序

示範

在這個應用程序的模型我已經有類似下面的情況:

  • 一個人可以有多個活動。
  • 一個活動可以由幾個人引用。
  • 人們的活動是與一個特定的領域(職位)排序。

我在我的數據庫中用三個表格表示了這種情況:people,activities,people_activities。表people_activities具有三個字段:person_id,activity_id,position。

了新的要求

一切工作細到現在爲止,但現在我已經有了一個新的要求,我應該能夠插入一個活動的其他人之上的人。

因此,如果people_activities表的內容比如這一個:

「標記閱讀0」 「標記運行1」

如果我收到添加「標記雜耍」的結果的請求應該是:

「標記雜耍0」 「標記讀數1」 「標記運行2」

的溶液

的REST接口的困境,現在來自於事實,我確定只有兩個選擇:使用像/人/標記/ addActivity單個URL

  • 但這似乎寧靜根本不會因爲它會修改未由URL引用的資源並且太多地包含「動詞」。
  • 使用我已經使用的一些URL(類似於/ people/mark/activities或/ people_activities?person = mark),並將新改變發佈到所有這些資源。這似乎是寧靜的,但在我看來很sl sl。

在您看來,處理這種情況的正確方法是什麼?我沒有考慮第三種選擇嗎?

首先編輯

就約我意識到另一個合理的解決辦法是這樣的情況在數據庫中結束的問題想好:

「標記雜耍-1」 「標記讀數0「 」標記運行1「

因爲位置只是一個數字,對我來說沒有」真實「值。在實踐中,我無法做到這一點,但它看起來像是一種寶貴的信息,也是一種添加新資源而不修改其他關聯的方式,這不是我從業務邏輯角度所要做的。

也許另一個錯誤是,我讓我的界面上溢出大量數據庫數據。在這種情況下,我從商業角度真正需要的是元素的順序,而不是它們的位置。位置是我在數據庫中用來完成排序的技術細節。

那麼另一個問題也許:

  • 是在您看來合理的修改一些信息在數據庫中,如果該信息僅僅是一個技術細節,它不是暴露在接口的用戶?
+0

我可能會這樣做的方式是'/ people/mark/activities'上的'POST'。但這不是你的選擇之一:D – cheesemacfly

+0

我只是不相信這是一個非常好的選擇。如果這是完成我想要做的最好的方法,那就沒問題。 – heapOverflow

回答

2

我認爲你插入新實體的位置爲min(position) - 1的解決方案聽起來不錯。

我們還希望構建一個由SQL數據庫支持的RESTful API,該數據庫允許對資源進行重新排序,並且面臨着如何在開始或中間添加新條目的實現細節列表,而不必更新所有實體中的頭寸。

在我們的實現,我們計劃用一個浮點數爲position領域,並計劃遵循以下規則:

  • 如果用戶想要插入實體列表的開始,具有position插入的min(position) - 1.0
  • 如果用戶想要插入實體到列表的末尾,用插入max(position) + 1.0
  • 如果用戶想要插入實體其他地方,有一個position等於平均的插入的positionposition兩個實體的任何一方。

隨着我們使用我們得到兩個實體之間插入1073之前,我們需要重新平衡技術,通過更新所有實體位置領域相互進行所有間隔1.0分開。這對我們的用例來說很好。

附註:隨着圖形數據庫,你就沒有這個問題。通過只更新節點兩端的兩個關係就可以很容易地在列表中的任何位置添加一個新的實體,就像在鏈接列表中插入某些東西時一樣。所以如果你不綁定到SQL數據庫,這是別的東西要考慮的

以上都是實現細節。關於API應該如何看待最終用戶,我會投票讓它看起來對您的客戶來說是最簡單的。在我們的用例中,我希望我們能夠使position字段顯示爲基於0的整數索引(就像數組一樣),因爲這對我們的客戶來說是最容易的。這意味着在列表的開頭插入一個新的實體會使所有其他實體中的position字段發生變化,但我認爲這很好。它不會在REST哲學的面前飛得太多。這是務實的。