  Data is a precious resource in today's society, and is generated at an
unprecedented and constantly growing pace. The need to store, analyze, and make
data promptly available to a multitude of users introduces formidable
challenges in modern software platforms. These challenges radically transformed
all research fields that gravitate around data management and processing, with
the introduction of distributed data-intensive systems that offer new
programming models and implementation strategies to handle data characteristics
such as its volume, the rate at which it is produced, its heterogeneity, and
its distribution. Each data-intensive system brings its specific choices in
terms of data model, usage assumptions, synchronization, processing strategy,
deployment, guarantees in terms of consistency, fault tolerance, ordering. Yet,
the problems data-intensive systems face and the solutions they propose are
frequently overlapping. This paper proposes a unifying model that dissects the
core functionalities of data-intensive systems, and precisely discusses
alternative design and implementation strategies, pointing out their
assumptions and implications. The model offers a common ground to understand
and compare highly heterogeneous solutions, with the potential of fostering
cross-fertilization across research communities and advancing the field. We
apply our model by classifying tens of systems: an exercise that brings to
interesting observations on the current trends in the domain of data-intensive
systems and suggests open research directions.
