I've come across a problem at work where I can't find information on the usual standard or practice for performing CRUD operations in a RESTful web service against a resource whose primary key is a composite of other resource ids. We are using MVC WebApi to create the controllers. For example, we have three tables:
Product
: PK=ProductIdPart
: PK=PartIdProductPartAssoc
: PK=(ProductId, PartId)
A product can have many parts and a part can be a component of many products. The association table also contains additional information relevant to the association itself than needs to be editable.
We have ProductsController
and PartsController
classes that handle the usual GET/PUT/POST/DELETE operations using route templates defined as: {controller}/{id}/{action}
such that the following IRIs work:
- GET,POST
/api/Products
- returns all products, creates a new product - GET,PUT,DELETE
/api/Products/1
- retrieves/updates/deletes product 1 - GET,POST
/api/Parts
- returns all parts, creates a new part - GET,PUT,DELETE
/api/Parts/2
- retrieves/updates/deletes part 2 - GET
/api/Products/1/Parts
- get all parts for product 1 - GET
/api/Parts/2/Products
- get all products for which part 2 is a component
Where I am having trouble is in how to define the route template for ProductPartAssoc resources. What should the route template and IRI look like for getting the association data? Adhering to convention, I would expect something like:
- GET,POST
/api/ProductPartAssoc
- returns all associations, creates an association - GET,PUT,DELETE
/api/ProductPartAssoc/[1,2]
- retrieves/updates/deletes association between product 1 and part 2
My coworkers find this aesthetically displeasing though and seem to think it would be better to not have a ProductPartAssocController
class at all, but rather, add additional methods to the ProductsController
to manage the association data:
- GET,PUT,DELETE
/api/Products/1/Parts/2
- get data for the association between product 1 and part 2 rather than data for part 2 as a member of part 1, which would conventionally be the case based on other examples such as/Book/5/Chapter/3
that I have seen elsewhere. - POST No clue here what they expect the IRI to look like. Unfortunately, they're the decision makers.
At the end of the day, I guess what I am seeking is either validation, or direction that I can point to and say "See, this is what other people do."
What is the typical practice for dealing with resources identified by composite keys?