There are three mandatory layers of any non-trivial user-facing web application. Storage, compute and view. The view is the front-end website and the mobile app(s). The storage is the database layer like MySQL or Mongo DB. The compute layer is the actual backend service serving the web content and related APIs.

Over the past decade, the compute layer has been standardized around Docker. One can use Docker on serverless services or more powerful declarative deployment approaches like Kubernetes. Pretty much all cloud providers now support these.

The view has been standardized more or less too. The web development has centered around React and to a lesser degree around the more independent and better quality framework Vue. The mobile development is controlled by the vendors. Swift for iOS. Kotlin for Android. And a significant chunk of folks tinkering with React Native. Even the compute and view layer interaction has now been standardized on simple but brittle REST APIs and more powerful but complicated GraphQL.

What surprisingly has not been standardized is the storage layer. There isn’t a standardized way to declaratively define one’s storage models, their migrations from one version to another, and their transformations from one form to another for consumption by various OLAP and OLTP systems in a vendor-neutral way.