第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在RESTful API中處理多對多關(guān)系?

如何在RESTful API中處理多對多關(guān)系?

如何在RESTful API中處理多對多關(guān)系?想象一下,你有2個實(shí)體,玩家和團(tuán)隊(duì),玩家可以在多個團(tuán)隊(duì)中。在我的數(shù)據(jù)模型中,我有一個每個實(shí)體的表,以及一個用于維護(hù)關(guān)系的連接表。Hibernate可以很好地處理這個問題,但是我如何在RESTful API中公開這種關(guān)系呢?我可以想幾個方面。首先,我可能讓每個實(shí)體都包含另一個實(shí)體的列表,因此Player對象將擁有它所屬的Teams列表,并且每個Team對象都有一個屬于它的Players列表。因此,要向團(tuán)隊(duì)添加播放器,您只需將播放器的表示形式發(fā)布到端點(diǎn),例如POST /player或POST /team,并將相應(yīng)的對象作為請求的有效負(fù)載。這對我來說似乎是最“RESTful”但感覺有點(diǎn)奇怪。/api/team/0:{     name: 'Boston Celtics',     logo: '/img/Celtics.png',     players: [         '/api/player/20',         '/api/player/5',         '/api/player/34'     ]}/api/player/20:{     pk: 20,     name: 'Ray Allen',     birth: '1975-07-20T02:00:00Z',     team: '/api/team/0'}我能想到的另一種方法就是將關(guān)系本身作為一種資源來揭露。因此,要查看給定團(tuán)隊(duì)中所有玩家的列表,您可以執(zhí)行GET /playerteam/team/{id}或類似的操作并獲取PlayerTeam實(shí)體列表。要將球員添加到球隊(duì),請/playerteam使用適當(dāng)構(gòu)建的PlayerTeam實(shí)體作為有效負(fù)載進(jìn)行POST 。/api/team/0:{     name: 'Boston Celtics',     logo: '/img/Celtics.png'}/api/player/20:{     pk: 20,     name: 'Ray Allen',     birth: '1975-07-20T02:00:00Z',     team: '/api/team/0'}/api/player/team/0/:[     '/api/player/20',     '/api/player/5',     '/api/player/34'        ]這是什么最好的做法?
查看完整描述

3 回答

?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個贊

制作一組單獨(dú)的/memberships/資源。

  1. 如果沒有別的話,REST就是要制作可進(jìn)化的系統(tǒng)。此時,您可能只關(guān)心某個玩家是否在某個特定團(tuán)隊(duì)中,但在將來的某個時刻,您希望用更多數(shù)據(jù)來注釋該關(guān)系:他們在該團(tuán)隊(duì)中待了多長時間,誰引用了他們對那個團(tuán)隊(duì),他們的教練是誰/當(dāng)時在那個團(tuán)隊(duì)等等。

  2. REST依賴于緩存效率,這需要考慮緩存原子性和失效。如果您將新實(shí)體POST到/teams/3/players/該列表將失效,但您不希望備用URL /players/5/teams/保持緩存狀態(tài)。是的,不同的緩存將包含不同年齡的每個列表的副本,并且我們無法做很多事情,但我們至少可以通過限制我們需要使實(shí)體無效的實(shí)體數(shù)量來最小化用戶POST更新的混淆在他們的客戶端的本地緩存中唯一一個/memberships/98745(見“交替指數(shù)”的埃蘭的討論生命超越分布式事務(wù)的更詳細(xì)的討論)。

  3. 您可以通過簡單地選擇/players/5/teams/teams/3/players(但不是兩者)來實(shí)現(xiàn)上述2點(diǎn)。讓我們假設(shè)前者。但是,在某些時候,您需要保留當(dāng)前成員資格/players/5/teams/的列表,并且能夠在某處引用過去的成員資格。讓超鏈接到列表中的資源,然后你可以添加當(dāng)你喜歡,而不必打破大家的書簽為個人會員資源。這是一般概念; 我相信你可以想象其他類似的期貨更適用于你的具體情況。/players/5/memberships//memberships/{id}//players/5/past_memberships/


查看完整回答
反對 回復(fù) 2019-08-14
?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊

我會將這種關(guān)系映射到子資源,一般設(shè)計(jì)/遍歷將是:

# team resource/teams/{teamId}# players resource/players/{playerId}# teams/players subresource/teams/{teamId}/players/{playerId}

在Restful-terms中,它有很多不用考慮SQL和連接,而是更多地考慮集合,子集合和遍歷。

一些例子:

# getting player 3 who is on team 1# or simply checking whether player 3 is on that team (200 vs. 404)GET /teams/1/players/3# getting player 3 who is also on team 3GET /teams/3/players/3# adding player 3 also to team 2PUT /teams/2/players/3# getting all teams of player 3GET /players/3/teams# withdraw player 3 from team 1 (appeared drunk before match)DELETE /teams/1/players/3# team 1 found a replacement, who is not registered in league yetPOST /players# from payload you get back the id, now place it officially to team 1PUT /teams/1/players/44

如你所見,我沒有使用POST將球員放到球隊(duì),而是PUT,它可以更好地處理球員和球隊(duì)的n:n關(guān)系。


查看完整回答
反對 回復(fù) 2019-08-14
  • 3 回答
  • 0 關(guān)注
  • 1231 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號