I defined a few different API-Over-*-Models here:
https://groups.google.com/d/msg/api-craft/rGPS2uwG5gs/Bx-8NCo9SekJ
"Good practice" depends on your goals, of course.
There are use cases for an API-Over-Data-Model approach. Sometimes one might want to expose a thin HTTP layer over their database to provide access to a platform that doesn't speak the native database protocol, for instance. Working in enterprises with tons of legacy code, this can be a common issue. Also, access to the HTTP service might be far less restrictive than access to the database directly. This is sometimes a use case, though often occurs with complex security politics in big organizations.
And then there's speed. If the goal is to expose a read-only API that maps exactly to the data model, there are options to get this up and running quickly. Time-to-launch can be drastically reduced.
However, as complexity increases, it makes sense to travel down the chain to API-Over-Domain-Model and finally API-Over-Application-Model (essentially your resource model at this point).
Cheers,
--
Kevin Swiber
@kevinswiber
https://github.com/kevinswiber