Я основываю свой вопрос на Как обращаться с отношения «многие ко многим» в RESTful API?, но хотите продолжить с принятого ответа.
Предположим, у нас есть отношение «многие ко многим» между игроками и командами (точно так же, как в вопросе, упомянутом выше).
Насколько я понимаю, есть несколько вариантов моделирования этого с помощью ресурсов REST:
Полезная нагрузка содержит ссылки на связанные ресурсы
GET /players/john
урожаи
{
"name": "John",
"_links": [
{
"rel": "team",
"href": "/teams/1"
},
{
"rel": "team",
"href": "/teams/4"
}
]
}
и
GET /teams/1
урожаи
{
"name": "Team 1",
"_links": [
{
"rel": "player",
"href": "/players/john"
},
...
]
}
Это заставляет меня обновлять ресурс игрока, когда я просто хочу добавить игрока в команду. Кроме того, когда я добавляю игрока в команду, используя ресурс игрока, соответствующий ресурс команды автоматически обновляется. Согласно Как справиться со многими отношения "ко многим" в RESTful API?:
вы не хотите, чтобы альтернативный URL-адрес /players/5/teams/ оставался в кеше
В этом случае team/1 может оставаться в кеше, когда я обновляю игрока «Джон», чтобы удалить из него команду «Team 1»!
Отношения моделируются как еще один ресурс
GET /teams/1
урожаи
{
"name": "Team 1",
}
и
GET /players/john
урожаи
{
"name": "John",
}
Ну наконец то,
GET /relationships
урожаи
[
{
"_links": [
{
"rel": "player",
"href": "/players/john"
},
{
"rel": "team",
"href": "/teams/1"
}
]
},
...
]
Таким образом, я могу создавать и удалять отношения, не затрагивая как ресурсы игрока, так и ресурсы команды. Но когда я удаляю /players/john, должны ли совпадающие отношения также автоматически удаляться? В этом случае нарушается то же правило, что и выше. Если это не так, нам нужно вручную удалить эти отношения, что требует большой работы, которой я не хочу обременять потребителей моего API.
Кроме того, если мы хотим обновить команды, в которых состоит определенный игрок «Джон», нам нужно удалить некоторые отношения и добавить другие. Мы открываемся для конфликтов слияния (и условий гонки), когда кто-то еще редактирует игрока «Джон» или команду «Команда 1».
Каждая сторона отношений получает свой собственный объект отношений
GET /teams/1/players
получается что-то вроде
{
"_links": [
{
"rel": "player",
"href": "/players/john"
},
...
]
}
и
GET /players/john/teams
что-то типа
{
"_links": [
{
"rel": "team",
"href": "/teams/1"
},
...
]
}
Но добавление или удаление может по-прежнему влиять на ресурс, расположенный по другому URL-адресу (который не имеет общего корневого элемента).
Мои вопросы
Есть ли проблемы, о которых я упоминал в обоих случаях?
Какой из обоих подходов «предпочтительнее» или более чистый REST?
Насколько серьезно я должен относиться к ограничениям, упомянутым в Как обрабатывать отношения "многие ко многим" в RESTful API?:
вы не хотите, чтобы альтернативный URL-адрес /players/5/teams/ оставался в кеше
Заранее спасибо!