Фактически, вы столкнулись с проблемой отношений. OData обеспечивает решение этой проблемы под названием «свойства навигации». Возможно, это может дать вам некоторые намеки на решение этой проблемы. Вы можете посмотреть на эти ссылки для получения более подробной информации: http://www.odata.org/getting-started/basic-tutorial/ и http://www.odata.org/getting-started/advanced-tutorial/
На самом деле, есть несколько вопросов здесь:
- Design представление вы хотите иметь при получении встречу
- МОДЕЛИРОВКИ представление для создания или обновления встречи
- Создайте представление для назначения (единичная мощность - «врач» и «пациент»)/добавьте и удалите (множественная мощность - «заботится») ссылка на встречу (например, врач)
Я думаю, что полное представление, которое вы даете в своем вопросе, соответствует тому, что вы ожидаете иметь при встрече, т. Е. Данные о назначении включают данные отношений, таких как врач, пациент и заботы.
Такие подсказки не обязательно связывать встречу с другими элементами, такими как врач и пациент. Имеются только идентификаторы. Я думаю, что у вас может быть другое представление для создания встречи. На этом уровне установки достаточно ссылки на элемент. Таким образом, вы могли бы somethinhg так:
POST /appointments
{
doctor-ref: http://.../doctors/8,
patient-ref: http://.../patients/4,
cares-ref: [ http://.../cares/1, http://.../cares/7 ]
}
или
POST /appointments
{
[email protected]: http://.../doctors/8,
[email protected]: http://.../patients/4,
[email protected]: [ http://.../cares/1, http://.../cares/7 ]
}
Таким же образом, вы можете определить дополнительные ресурсы, чтобы иметь возможность обновлять эти ссылки после назначения было создано без отправки всего содержимого ,Мы могли бы представить себе что-то вроде этого:
Single кардинальность
PUT /appointments/<appointmentid>/doctor
{ [email protected]: http://.../doctors/8 }
Multiple мощность
POST /appointments/<appointmentid>/cares
{ metadata.ref: http://.../cares/8 }
DELETE appointments/<appointmentid>/cares
{ metadata.ref: http://.../cares/8 }
Вы можете заметить, что вы можете также выбрать, чтобы не получить все данные назначения для встречи (если это что-то интересное для вас). Вот различные представления вы могли бы:
Полный
{
doctor: {
id: 8,
name: 'Dr James Brown',
phone: '107-102-304',
address: '16th avenue'
},
patient: {
id: 4,
name: 'Mr Elvis',
pathology: 'Blah Blah.'
},
cares:
[
{
id: 1,
name: 'Dental cares'
},
{
id: 7,
name: 'Back pain'
}
]
}
}
Parial с ссылки/ссылки
{
[email protected]: http://.../doctors/8,
patient: {
id: 4,
name: 'Mr Elvis',
pathology: 'Blah Blah.'
},
[email protected]: [ http://.../cares/1, http://.../cares/7 ]
}
или
{
[email protected]: http://.../doctors/8,
patient: {
id: 4,
name: 'Mr Elvis',
pathology: 'Blah Blah.'
},
cares:
[
{
id: 1,
name: 'Dental cares'
},
{
id: 7,
name: 'Back pain'
}
]
}
}
Эта функция соответствует в OData к параметру запроса $expand
.
Вы можете взглянуть на эту ссылку: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4. См. Разделы «Получение связанных объектов», «Создание отношения между объектами» и «Удаление связи между объектами». Это может дать подсказки для вашего представления.
Последняя часть вопроса связана с способом построения представления (например, для создания). Я не знаю точно, какую технологию вы используете, но на Java вы можете сделать что-то вроде этого appointment.doctor = selected_doctor
и немного адаптировать сериализацию своих объектов, чтобы создать что-то вроде этого [email protected]: http://.../doctors/8
из экземпляра Doctor. Например, с Jackson2, это называется пользовательским сериализатором (см., Например, эту ссылку http://www.baeldung.com/jackson-custom-serialization).
Надеется, что это помогает вам, Тьерри
Спасибо большое за подробный ответ! И жаль, что на это время ответить. Я не знал об OData, и я буду изучать его. Ура! – MonsieurNinja