If you really want to avoid hard communication, I suggest that you simply implement and abstract the layer on top of the minimum set of functions available on both types of storages.
But in any case, what you are trying to do does not make sense to me. The cloud (non-relational) storage is so peculiar that an attempt to create a common ORM will be a gigantic mistake. Modern SQL ORMs are “good” because RDBMS have a common minimum set of functions, which is actually quite extensive, and in most cases you don't need exotic things. With cloud storage, each implementation is almost unique, precisely because the very first aspect to keep in mind is scalability. For example, if you throw away Blob in Azure because they don’t exist in Amazon (I have no idea, I just make an example), then it will probably be difficult for you to control the simultaneous blob access in Amazon and in Lazur too, and it doesn’t have meaning.
I would prefer to implement a data access layer that is reasonably designed to avoid problems, but use ALL the available features on both platforms (with very different implementations, if necessary).
source share